Windows Dev. Site

PowerShell RunspacePool

パワーシェルコマンドを非同期で並列に実行するテストです。時間を表示して並行に実行していることを確認しました。

環境: PowerShell version 5 / Windows 10

$PSVersionTable
Set-ExecutionPolicy RemoteSigned

(ポリシー変更を管理者権限で実行)

実行画面
powershell_run01

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