Долго работающий скрипт Powershell зависает

Мы используем продолжительный сценарий PowerShell для выполнения множества небольших операций, которые могут занять очень много времени. Примерно через 30 минут скрипты зависли. Мы смогли снова запустить сценарии, нажав Ctrl-C, что привело к возобновлению выполнения сценариев, а не к завершению процесса.

Есть ли какой-то тайм-аут сценария или механизм, предотвращающий выполнение длительных сценариев в PowerShell?


person smaclell    schedule 08.07.2010    source источник
comment
Всем, кто сталкивается с той же проблемой, проверьте это отключить эту функцию   -  person gavin    schedule 11.11.2018


Ответы (4)


У меня была эта проблема из-за плохой привычки, которая у меня есть. Если вы выделите немного текста внутри консоли powershell, журналы скриптов зависнут. Убедитесь, что после запуска большого скрипта ничего не выбрано :)

person Flament Mickaël    schedule 07.11.2017

Попробуйте мой скрипт таймера уничтожения. Просто измените переменную $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
person Jonathan Ramackers    schedule 10.04.2019

Как уже упоминалось, при нажатии/выборе текста в консоли powershell скрипт останавливается. Вы можете отключить это поведение следующим образом:

  • Щелкните правой кнопкой мыши строку заголовка

  • Выберите Properties

  • Выберите Options

  • Под Edit Options отключите QuickEdit Mode

Примечание. Вы больше не сможете выбирать текст в окне PowerShell.

person GChuf    schedule 24.06.2021

попробуйте добавить процентный расчет в свой сценарий... чтобы вы могли определить, сколько времени потребуется для завершения...

person Sankar M    schedule 06.12.2012
comment
Как правило, не помещайте ссылки в ответ, если ссылка не содержит релевантную информацию для вопроса. Вы можете указать ссылку на свой блог в своем профиле. - person WEFX; 06.12.2012