Powershell - в поисках лучшего способа проверки завершения нескольких процессов - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть скрипт, который создает некоторые процессы с помощью команды Start-Process. Могут быть запущены сотни процессов. Сценарий работает просто отлично, но я надеюсь, что кто-нибудь может предоставить мне более элегантный способ проверить, все ли запущенные процессы завершены? Тот, который не требует никакого ввода, поскольку я ищу создание автоматизированного решения.

Ниже приведен пример кода.

$procList = @()

$cmd = "C:\Windows\SysWOW64\PING.EXE"
$cmdArgs = " nos3nse.com"
$proc1 = Start-Process $cmd -ArgumentList $cmdArgs -PassThru
$proc2 = Start-Process $cmd -ArgumentList $cmdArgs -PassThru
$proc3 = Start-Process $cmd -ArgumentList $cmdArgs -PassThru

$procObject = New-Object psobject -Property @{
    id = $proc1.Id
    name = $proc1.Name
    startTime = $proc1.StartTime
    dtlLogFile = $dtlLogFileTemp
}
$procList += $procObject

$procObject = New-Object psobject -Property @{
    id = $proc2.Id
    name = $proc2.Name
    startTime = $proc2.StartTime
    dtlLogFile = $dtlLogFileTemp
}
$procList += $procObject

$procObject = New-Object psobject -Property @{
    id = $proc3.Id
    name = $proc3.Name
    startTime = $proc3.StartTime
    dtlLogFile = $dtlLogFileTemp
}
$procList += $procObject

# Is there a better way to find out if these jobs have all completed?
$ppFlag = $true
while ($ppFlag) {
  foreach ($proc in $procList) {
    $chkJob = Get-Process -id $proc.id -ErrorAction SilentlyContinue
    if ($chkJob.HasExited -eq $false) 
      { 
        Write-Host ("looping")
        Write-Host ("Sleeping 2 seconds") -ForegroundColor Yellow
        Start-Sleep -Seconds 2
        break #break foreach loop
      }
  } #foreach
  if ($chkJob.HasExited -ne $false) { $ppFlag = $false }
} #while

1 Ответ

0 голосов
/ 03 апреля 2020

Как насчет этого?

$a = start -NoNewWindow powershell {timeout 10; 'a done'} -PassThru
$b = start -NoNewWindow powershell {timeout 10; 'b done'} -PassThru
$c = start -NoNewWindow powershell {timeout 10; 'c done'} -PassThru
$a,$b,$c | wait-process

Waiting for  0 seconds, press a key to continue ...
Waiting for  0 seconds, press a key to continue ...
Waiting for  0 seconds, press a key to continue ...

a done
b done
c done

Процесс ожидания можно использовать с массивом. Может быть, вы должны обновить свой вопрос.

1..3 | foreach { start -NoNewWindow powershell {timeout 5; 'done'} -PassThru } | 
  wait-process
...