由于Symantec Antivirus(SEP)v14导致的超时,需要将我的代码从直接调用更改为Start-Job precedure,使我的脚本挂起。
这个快照工作得很好:
$updateDaten = Get-HotFix -computername "myserver" | % { $_.psbase.properties["installedOn"].Value } | Group-Object | select-object Name
对起始作业预备的改变完全弄乱了所产生的对象。我正在谷歌搜索和测试两天,但无法找到在处理工作对象时如此复杂:
function Get-HotfixesListAsJob($computer, $timeout){
$job = Start-Job { param($c) Get-HotFix -computername $c |
% { $_.psbase.properties["installedOn"].Value } | Group-Object
} -ArgumentList $computer
Wait-Job $job -Timeout $timeout
Stop-Job $job
Receive-Job $job
Remove-Job $job
}
$updateDaten = Get-HotfixesListAsJob -computer "myserver" -timeout 80
但是我无法使用Receive-Job获得相同的结果。我总是得到一些有线的作业对象,我不能像以前那样只提取数据。为什么结果如此完全不同?是否可以像以前那样将数据放回到对象中而不是作业对象?
顺便说一句。这篇有趣的文章没有解决我的问题: https://learn-powershell.net/2014/06/27/quick-hits-did-i-really-lose-my-output-with-receive-job-by-not-usingkeep/
提前感谢您的回答
答案 0 :(得分:0)
您所拥有的问题不是因为代码。因为Start-job或任何PS Job会话,基本上都会拥有与该工作相关的所有细节,属性。
所以,我可以在第一种情况下看到你做了一个分组,最后只选择了名称,后者不存在。
所以我建议你把它添加到函数中。
还有一件事, Wait-job 也将在控制台中输出值。重定向或将其重命名为null以避免这种情况。
您还可以使用带有作业ID或名称的 receive-job 来接收作业。我认为会更好。只需检查工作状态;完成后接收它。