それらしいものを
function Start-ThrottlingJob {
Param(
[int]$StartupInterval = 2,
[int]$IntervalSecond = 5,
[int]$Parallel = 5,
[string]$Name,
[Parameter(ValueFromPipeline=$True)][object[]]$ArgumentList,
[Parameter(Mandatory=$True)][scriptblock]$ScriptBlock
)
begin {
$q = New-Object System.Collections.Queue
}
process {
foreach($o in $ArgumentList){
$q.Enqueue($o) | Out-Null
}
}
end {
while($q.Count -ne 0)
{
if ((get-job -state Running).Count -ge $Parallel) { break }
$task = $q.dequeue()
$n = if ($Name -ne $null) { $task.$name } elseif ($task -is [string]) { $task }
Start-Job $ScriptBlock -Name $n -ArgumentList $task -Verbose
Start-Sleep $StartupInterval
}
while($q.Count -ne 0)
{
Start-Sleep $IntervalSecond
if ((get-job -state Running).Count -ge $Parallel) { continue }
$task = $q.dequeue()
$n = if ($Name -ne $null) { $task.$name } elseif ($task -is [string]) { $task }
Start-Job $ScriptBlock -Name $n -ArgumentList $task
}
}
}
テスト
$sb = { param($a) sleep (get-random -min 1 -max 60); echo $a.FullName }
ls | Start-ThrottlingJob -StartupInterval 1 -Parallel 10 -name name -ScriptBlock $sb
ゴテゴテしてしまったけど、それらしく動いたので良いことにする