Powershell Start-Jobs限制

时间:2014-05-08 20:39:28

标签: powershell start-job

我在遏制工作方面遇到了麻烦,并且"挂了"或者"失败"工作。这基本上就是我想做的事情。

$allServers = Import-Csv "C:\temp\input.csv"
$job = $allServers | % {
    while (@(Get-Job -State Running).Count -ge 6) {
        Start-Sleep -Seconds 2
    }
    Start-Job -Name $_.computerName -ScriptBlock {
        param ($cpn,$dom)
        (DO QUERIES HERE)
        (OUTPUT TO OBJECT HERE)
    } -ArgumentList $_.computerName,$_.Domain 
}
$jobsdone = $job | Wait-Job | Receive-Job

我想运行5个并发作业,这很简单。

问题是当我查询没有响应的服务器时,作业挂起并且脚本永远不会结束。我试过添加......

Wait-Job -Name $_.computerName -Timeout 20

...在最后一个大括号之上,但所有这一切都有效地限制了一个线程的并发,直到20秒过去,然后放弃挂起的工作来做其他工作。整个剧本在那个例子中仍然没有完成。

只要我没有获得无响应的服务器,此代码在没有限制和等待工作的情况下工作正常。

1 个答案:

答案 0 :(得分:3)

在while循环中检查作业运行的时间长度。如果这大于您确定的某个超时,则停止该作业,例如:

while (@(Get-Job -State Running).Count -ge 6) {
    $now = Get-Date
    foreach ($job in @(Get-Job -State Running)) {
        if ($now - (Get-Job -Id $job.id).PSBeginTime -gt [TimeSpan]::FromMinutes(2)) {
            Stop-Job $job
        }
    }
    Start-Sleep -sec 2
}

您可能希望查看此PowerShell team blog post有关如何使用队列限制作业的信息。