接收 - 工作不同于直接呼叫

时间:2017-05-31 06:50:33

标签: windows powershell windows-server-2008-r2

由于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/

提前感谢您的回答

1 个答案:

答案 0 :(得分:0)

您所拥有的问题不是因为代码。因为Start-job或任何PS Job会话,基本上都会拥有与该工作相关的所有细节,属性。

所以,我可以在第一种情况下看到你做了一个分组,最后只选择了名称,后者不存在。

所以我建议你把它添加到函数中。

还有一件事, Wait-job 也将在控制台中输出值。重定向或将其重命名为null以避免这种情况。

您还可以使用带有作业ID或名称的 receive-job 来接收作业。我认为会更好。只需检查工作状态;完成后接收它。