未検証。手動実行想定。
単純に実行するときの書き方
# コマンドを実行したときにホスト名が縦に並ぶので実行している処理が判りやすい。
$Job = {
# 各サーバで実行したい処理
}
Invoke-Command -AsJob -ScriptBlock $Job -ComputerName hoge
Invoke-Command -AsJob -ScriptBlock $Job -ComputerName fuga
Invoke-Command -AsJob -ScriptBlock $Job -ComputerName piyo
# ...
Get-Job | Wait-Job | Receive-Job
まとめて実行したいけどスロットリングしたいときの書き方
# 一気に流すと負荷が怖い
$Job = {
# 各サーバで実行したい処理
}
# ジョブの数が減るまで待機するだけの関数
function throttle {
param($n = 5)
$jobs = get-job -state running
while($jobs.Count -ge $n){
sleep 1
$jobs = get-job -state running
}
}
throttle; Invoke-Command -AsJob -ScriptBlock $Job -ComputerName hoge
throttle; Invoke-Command -AsJob -ScriptBlock $Job -ComputerName fuga
throttle; Invoke-Command -AsJob -ScriptBlock $Job -ComputerName piyo