3

我在限制工作和“挂起”或“失败”的工作时遇到了麻烦。这基本上是我想要做的。

$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 秒过去,然后放弃挂起的工作去做其他工作。在那种情况下,整个脚本仍然没有完成。

只要我没有得到无响应的服务器,此代码就可以正常工作,无需节流和工作等待。

4

1 回答 1

4

在您的 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 团队博客文章。

于 2014-05-09T05:01:57.967 回答