У меня есть скрипт, который я использую для запуска заданий и управления ими. Я успешно использовал его в прошлом, но недавно цикл 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