最近、これに対する答えはたくさんあります。
- ジョブ(またはPS 6/7またはモジュールのスレッドジョブ)
- 開始プロセス
- ワークフロー
- 別の実行空間を備えたpowershell api
- すべてlocalhostにすることができる複数のコンピューターでのinvoke-command(管理者である必要があります)
- ISEの複数のセッション(実行スペース)タブ、またはリモートのPowerShell PowerShell ISEタブ
- Powershell 7は
foreach-object -parallel
#4の代替として
文字通りforeach -parallelを使用したワークフローを次に示します。
workflow work {
foreach -parallel ($i in 1..3) {
sleep 5
"$i done"
}
}
work
3 done
1 done
2 done
または、並列ブロックを使用したワークフロー:
function sleepfor($time) { sleep $time; "sleepfor $time done"}
workflow work {
parallel {
sleepfor 3
sleepfor 2
sleepfor 1
}
'hi'
}
work
sleepfor 1 done
sleepfor 2 done
sleepfor 3 done
hi
ランスペースを使用したAPIの例を次に示します。
$a = [PowerShell]::Create().AddScript{sleep 5;'a done'}
$b = [PowerShell]::Create().AddScript{sleep 5;'b done'}
$c = [PowerShell]::Create().AddScript{sleep 5;'c done'}
$r1,$r2,$r3 = ($a,$b,$c).begininvoke() # run in background
$a.EndInvoke($r1); $b.EndInvoke($r2); $c.EndInvoke($r3) # wait
($a,$b,$c).streams.error # check for errors
($a,$b,$c).dispose() # clean
a done
b done
c done
receive-job (wait-job ($a = start-job { "heyo!" })); remove-job $a
またはジョブが完了する前に$a = start-job { "heyo!" }; wait-job $a; receive-job $a; remove-job $a
呼び出すとreceive-job
、何も得られない場合があることにも注意してください。