Дълго работещият 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