20/06/26 10:47:41 lJi08xny.net
>>449
こんな感じ?
ただ動くだけのサンプル。エラー処理とかオブジェクトの後始末とか何もしていない。
function Invoke-ThreadedPipeline([ScriptBlock[]] $ScriptBlock) {
$p = $ScriptBlock | % {
$p = [RunspaceFactory]::CreateRunspace().CreatePipeline()
$p.Commands.AddScript($_)
$p.Runspace.Open(); $p.InvokeAsync()
$p
}
while ($p = @($p | ? {-not $_.Output.EndOfPipeline})) {
$i = [Threading.WaitHandle]::WaitAny(($p | % {$_.Output.WaitHandle}))
$o = $p[$i].Output.Read($p[$i].Output.Count)
if ($i -lt $p.Length - 1) {
$null = $p[$i + 1].Input.Write($o, $true)
if ($p[$i].Output.EndOfPipeline) {$p[$i + 1].Input.Close()}
}
else {
$o
}
}
}
$o = Get-Date
Invoke-ThreadedPipeline (
{1..10},
{process {Start-Sleep 1; ">$_"}},
{process {Start-Sleep 1; ">$_"}},
{process {Start-Sleep 1; ">$_"}}
) | % {'{0} : {1}' -f $_, (New-TimeSpan $o).TotalSeconds}