PowerShell RunspacePool
パワーシェルコマンドを非同期で並列に実行するテストです。時間を表示して並行に実行していることを確認しました。
環境: PowerShell version 5 / Windows 10
$PSVersionTable
Set-ExecutionPolicy RemoteSigned
(ポリシー変更を管理者権限で実行)
runtest.ps1
$cmds = @( "sleep 1; get-date", "sleep 2; get-date", "sleep 3; get-date" ) $len = $cmds.Length $pool = [RunspaceFactory]::CreateRunspacePool(1, $len) $pool.Open() $arrPs = New-Object System.Collections.ArrayList $arrRes = New-Object System.Collections.ArrayList for ( $i = 0; $i -lt $len; $i++ ) { $cmd = $cmds[$i] $ps = [PowerShell]::Create() $ps.RunspacePool = $pool $ps.AddScript($cmd) | Out-Null # $ps.AddCommand("Out-String") $res = $ps.BeginInvoke() $arrPs.Add($ps) | Out-Null $arrRes.Add($res) | Out-Null } while ( $arrPs.Count -gt 0 ){ for ( $i = 0; $i -lt $arrPs.Count; $i++ ){ $ps = $arrPs[$i] $res = $arrRes[$i] if($ps -ne $null){ if($res.IsCompleted){ $result = $ps.EndInvoke($res) Write-host $result $ps.Dispose() $arrPs.RemoveAt($i) $arrRes.RemoveAt($i) } } } } $pool.Close()
参考: https://www.gmo.jp/report/single/?art_id=195