【问题标题】:Long Running Powershell Script Freezes长时间运行的 Powershell 脚本冻结
【发布时间】:2010-07-08 14:08:31
【问题描述】:

我们正在使用一个长时间运行的 PowerShell 脚本来执行许多可能需要很长时间的小操作。大约 30 分钟后,脚本冻结了。我们可以通过按Ctrl-C 让脚本重新开始运行,这会导致脚本恢复执行而不是终止进程。

是否有某种脚本超时或机制阻止在 PowerShell 中长时间运行脚本?

【问题讨论】:

  • 对于遇到相同问题的任何人,请查看this 以禁用此“功能”

标签: powershell-2.0 long-running-processes


【解决方案1】:

由于我有一个坏习惯,我遇到了这个问题。如果您在控制台 powershell 中选择一点文本,脚本日志将冻结。确保启动大脚本后未选择任何内容:)

【讨论】:

    【解决方案2】:

    如前所述,在 powershell 控制台中单击/选择文本时,脚本会停止。您可以像这样禁用此行为:

    • 右击标题栏

    • 选择Properties

    • 选择Options

    • Edit Options下,禁用QuickEdit Mode

    注意:您将无法再从 powershell 窗口中选择文本。

    【讨论】:

      【解决方案3】:

      试试我的杀戮计时器脚本。只需将$ScriptLocation 变量更改为您要运行的脚本。然后,该脚本将作为后台作业运行,而当前窗口会跟踪计时器。时间到期后,当前窗口将终止后台作业并将其全部写入日志。

          Start-Transcript C:\Transcriptlog-Cleanup.txt #write log to this location
      $p = Get-Process  -Id $pid | select -Expand id  # -Expand selects the string from the object id out of the current process.
      Write-Host $p
      $BJName = "Clean-up-script"   #Define Background job name
      
      $startTime = (Get-Date) # set start time
      $startTime
      $expiration = (Get-Date).AddMinutes(2)#program expires at this time
      # you could change the expiration time by changing (Get-Date).AddSeconds(20) to (Get-Date).AddMinutes(10)or to hours or whatever you like
      
      
      #-----------------
      #Timer update function setup
      function UpdateTime
         {
          $LeftMinutes =   ($expiration) - (Get-Date) | Select -Expand minutes  # sets minutes left to left time
          $LeftSeconds =   ($expiration) - (Get-Date) | Select -Expand seconds  # sets seconds left to left time
      
      
          #Write time to console
          Write-Host "------------------------------------------------------------------" 
          Write-Host "Timer started at     :  "  $startTime
          Write-Host "Current time         :  "  (Get-Date)
          Write-Host "Timer ends at        :  "  $expiration
          Write-Host "Time on expire timer :  "  $LeftMinutes "Minutes" $LeftSeconds "Seconds"
          Write-Host "------------------------------------------------------------------" 
          }
      
          #get background job info and remove the it afterwards + print info
      function BJManager   
          {
             Receive-Job -Name $BJName  #recive background job results
             Remove-Job -Name $BJName -Force #remove job
             Write-Host "Retrieving Background-Job info and Removing Job..."
          }
      #-----------------
      $ScriptLocation = "C:\\Local-scripts\Windows-Server-CleanUp-Script-V2.4(Beta).ps1"  #change this Var for different kind of script locations
      
      Start-Job -Name $BJName -FilePath $ScriptLocation #start this script as background job
      # dont start job in the loop.
      do{   #start loop
      
         Write-Host "Working"#start doing other script stuff
         Start-Sleep -Milliseconds 5000  #add delay to reduce spam and processing power
         UpdateTime #call upadate function to print time
      
         Get-Job -Name $BJName  | select Id, State ,Location , Name
              if((Get-Job).State -eq "Failed")
                  {
                      BJManager
                  }
              elseif((Get-Job).State -eq "Completed")
                  {
                      BJManager
                  }
      
       }
      until ($p.HasExited -or (Get-Date) -gt $expiration) #check exit time
      
      Write-Host "Timer Script Finished"
      Get-Job -Name $BJName  | select Id, State ,Location , Name
      UpdateTime
      
      BJManager
      
      Start-Sleep -Milliseconds 5000 #give it some time to write to log
      Stop-Transcript
      Start-Sleep -Milliseconds 5000 #give it some time to stop the logging before killing process
      if (-not $p.HasExited) { Stop-Process -ID $p -PassThru } # kill process after time expires
      

      【讨论】:

        【解决方案4】:

        尝试在您的脚本中添加百分比计算...这样您就可以确定完成所需的时间...

        【讨论】:

        • 一般来说,除非链接包含问题的相关信息,否则不要在答案中放置链接。您可以在个人资料中链接到您的博客。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 1970-01-01
        • 2018-07-02
        相关资源
        最近更新 更多