当前,我尝试多次运行脚本,并让父级等待所有子级进程完成。
孩子的创建如下:
# 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()
来等待孩子。
答案 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脚本块调用输出的过程对象。