Скрипт Powershell зависает случайным образом при запуске работы - PullRequest
0 голосов
/ 11 января 2019

У меня есть скрипт, который я использую для запуска заданий и управления ими. Я успешно использовал его в прошлом, но недавно цикл foreach зависнет. Скрипт показывает его прогресс и количество созданных потоков (заданий). Когда скрипт зависает, я вижу запущенные задачи в диспетчере задач (Process Explorer). Когда я завершу последнюю задачу Powershell, созданную по сценарию, сценарий продолжится. Я попытался использовать несколько сценариев работы, и я получил тот же результат. Я никогда не получаю сбой, поэтому нет никаких журналов, чтобы посмотреть.

Он зависает в «Start-Job». Общее количество созданных заданий достигает 1600 и всего 60, в зависимости от выполняемого мной дочернего скрипта, и зависает на случайных итерациях, пока не завершится процесс, который повешен.

$ScriptFile = $(".\DesMime2.ps1")
$MaxThreads = 20
$SleepTimer = 100
$MaxWaitAtEnd = 600
$filename = ".\Install3.csv"

$computers = (get-adcomputer -filter *).name
$Complete = Get-date


"Killing existing jobs . . ."
Get-Job | Remove-Job -Force
"Done."

clear-host

$i = 0

ForEach ($Computer in $Computers){
    While ($(Get-Job -state running).count -ge $MaxThreads){
        Write-Progress  -Activity "Creating Server List" `
        -Status "Waiting for threads to close" `
        -CurrentOperation "$i threads created - $($(Get-Job -state running).count) threads open" `
        -PercentComplete ($i / $Computers.count * 100)
        Start-Sleep -Milliseconds $SleepTimer
    }

    $i++
    Start-Job -FilePath $ScriptFile -ArgumentList $Computer -Name $Computer #| Out-Null
    Write-Progress -Activity "Server List" `
    -Status "Starting Threads" `
    -CurrentOperation "$i threads created - $($(Get-Job -state running).count) threads open" `
    -PercentComplete ($i / $Computers.count * 100)
}

While ($(Get-Job -State Running).count -gt 0){
    $ComputersStillRunning = ""
    ForEach ($System  in $(Get-Job -state running)){$ComputersStillRunning += ", $($System.name)"}
    $ComputersStillRunning = $ComputersStillRunning.Substring(2)
    Write-Progress -Activity "List" `
    -Status "$($(Get-Job -State Running).count) threads remaining" `
    -CurrentOperation "$ComputersStillRunning" `
    -PercentComplete ($(Get-Job -State Completed).count / $(Get-Job).count * 100)
    If ($(New-TimeSpan $Complete $(Get-Date)).totalseconds -ge $MaxWaitAtEnd){"Killing all jobs still running . . .";Get-Job -State Running | Remove-Job -Force}
    Start-Sleep -Milliseconds $SleepTimer
}

"Reading all jobs"

Get-Job | Receive-Job | Select-Object * -ExcludeProperty RunspaceId,PSComputerName,PSShowComputerName | export-csv $filename -notype 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...