等待所有子进程完成

时间:2018-10-20 09:18:03

标签: powershell start-process

当前,我尝试多次运行脚本,并让父级等待所有子级进程完成。

孩子的创建如下:

# Spawn balance load processes
$command = "-i $ScriptPath\balanceLoaders\%BALANCE_DIR% -o $outputDirectory -c %BALANCE_DIR%"
#$command = "$ScriptPath\convertFiles.ps1 -i $ScriptPath\balanceLoaders\%BALANCE_DIR% -o $outputDirectory -c %BALANCE_DIR%"
for ([int]$i = 0; $i -lt $b; $i++) {
    #$proc = Start-Process powershell.exe -WindowStyle Hidden -Argument $command.Replace('%BALANCE_DIR%', $i) -PassThru
    $proc = Start-Process $ScriptPath\convertfiles.exe -WindowStyle Hidden -Verb Runas -ArgumentList $command.Replace('%BALANCE_DIR%', $i) -PassThru
}

孩子是动态产生的。目前,我只能使用$proc来跟踪最后一个生成的孩子。但是,我想全部跟踪。

当前使用$proc.WaitForExit()来等待孩子。

2 个答案:

答案 0 :(得分:3)

收集数组中的所有进程并运行一个空闲循环,直到所有进程都退出为止。

_firestore.collection(collectionName).where("chatMembers.userId", isEqualTo: userId).snapshots()

如果您使用的是PowerShell v3或更高版本,则可以将循环简化为以下形式:

$proc = for ($i = 0; $i -lt $b; $i++) {
    Start-Process ... -PassThru
}

while (($proc | Select-Object -Expand HasExited) -contains $false) {
    Start-Sleep -Milliseconds 100
}

因为PowerShell v3引入了一项名为member enumeration的新功能,该功能允许通过数组对象访问数组元素的属性或方法。

答案 1 :(得分:1)

Ansgar Wiecher's helpful answer包含良好的指针和可行的解决方案,但是如果您只想等待所有生成的进程终止,则使用Wait-Process比较简单< / strong>。

也就是说,如果要检查退出代码可用时 ,请在所有进程退出之前,循环像安斯加(Ansgar)的回答那样,定期睡眠(Start-Sleep

以下解决方案通过一个简化的示例演示了使用Wait-Process 全部等待技术,该示例创建了3个记事本实例并等待所有实例终止:

# Create all processes and store objects representing them in array $procs.
$b = 3 # number of processes to create
$procs = foreach ($i in 0..($b-1)) { Start-Process -PassThru Notepad }

# Wait for all processes to exit.
# (Close the Notepad windows manually or, if no Notepad windows were previously
# open, use `Stop-Process -Name Notepad` from another session to forcefully close them.)
# Use Wait-Process -Timeout <secs> to limit the max. period of time to wait.
$procs | Wait-Process 

# Get the exit codes.
$exitCodes = $procs.ExitCode # PSv3+; v2: $procs | Select-Object -ExpandProperty ExitCode

或者,作为单个管道:

# Use $_ inside { ... } to refer to the current iteration value.
# Use $procs.ExitCode to get the exit codes.
0..($b-1) | ForEach-Object -ov procs { Start-Process -PassThru Notepad } | Wait-Process

请注意-ov的使用-公用参数-OutVariable的缩写,它收集ForEach-Object cmdlet脚本块调用输出的过程对象。