代码以交互方式工作,在PS1文件中它没有。重现,打开powershell,粘贴该函数,然后运行get-job来查看任务。输入get-job |完成后删除作业,然后将代码放入PS1文件中,它只运行前两个,然后退出。
function RunJobFromQueue
{
if( $queue.Count -gt 0)
{
$cn = $queue.Dequeue()
$j = Start-Job -name $cn -ScriptBlock {param($x); Start-Sleep -Seconds 10;"output - " + $x} -ArgumentList $cn
Register-ObjectEvent -InputObject $j -EventName StateChanged -Action {RunJobFromQueue; Unregister-Event $eventsubscriber.SourceIdentifier; Remove-Job $eventsubscriber.SourceIdentifier } | Out-Null
}
}
$maxConcurrentJobs = 2
$jobInput = "test1", "test2", "test3", "test4", "test5", "test6"
$queue = [System.Collections.Queue]::Synchronized( (New-Object System.Collections.Queue) )
foreach($item in $jobInput) {$queue.Enqueue($item)}
for( $i = 0; $i -lt $maxConcurrentJobs; $i++){RunJobFromQueue}
答案 0 :(得分:4)
在我看来:它在脚本中失败了,因为:
解决/解决它的两个选项:
function Global:RunJobFromQueue
,$global:queue
). .\YourScript.ps1
)这可以很好地交互式工作,因为在这种情况下你可以在全局范围内定义函数/变量,所以-Action可以很好地找到它们。