接收作业与直接呼叫不同

问题描述:

由于Symantec Antivirus(SEP)v14引起的超时,需要将我的代码从直接呼叫更改为启动作业程序,因此我的脚本被挂起。接收作业与直接呼叫不同

此快照是这么长时间工作的罚款:

$updateDaten = Get-HotFix -computername "myserver" | % { $_.psbase.properties["installedOn"].Value } | Group-Object | select-object Name 

变化的开始作业preocedure完全打乱了生成的对象。 IM使用Google现在测试了两天,但不能找出什么是如此complicatet在处理作业对象:

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 

但是我不能够得到同样的结果回用接收-工作。我总是得到一些有线的工作对象,我不能像以前一样提取数据。为什么结果如此完全不同?是否有可能将数据恢复到之前的对象而不是作业对象?

btw。这个有趣的文章没有解决我的问题: https://learn-powershell.net/2014/06/27/quick-hits-did-i-really-lose-my-output-with-receive-job-by-not-usingkeep/

谢谢您的回答提前

+1

您的代码有效。首先在函数中,你不需要'select-object Name',所以你也可以获得其他的属性 - RunspaceId,Group等等。其次,'wait-job'的输出也是由你的函数输出的,你可能想'等待作业$ job -Timeout $ timeout | Out-Null'使其沉默。但Get-HotFix的结果从您的函数返回... – TessellatingHeckler

+0

谢谢@TessellatingHeckler Wait-Job $ job -Timeout $ timeout | Out-Null真的解决了这个问题!输出结果搞砸了返回的对象,我从来没有考虑过这个行为。不幸的是,它通常没有记录和危险! –

您有什么问题,是因为代码没有。因为开始工作或任何PS工作会议基本上都将具有与该工作相关的所有细节和属性。

因此,我可以看到在第一种情况下,您已经完成了一个分组,最后只选择名称,这在后面的例子中不存在。

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

还有一件事,等待工作也将在控制台中输出值。重定向或将其管道为空以避免这种情况。

您还可以使用接收作业接收作业ID或名称。我认为这会更好。只需检查工作状态;一旦完成收到它。

+0

谢谢! Wait-Job $ job -Timeout $ timeout | Out-Null'解决了我的对象 - 混乱!分组后,我有我的对象中的属性“计数,名称,组”。所以我认为只使用'Name'的不同值。 –

+0

我想你应该接受TessellatingHeckler的答案。我稍后注意到它。他更准确地说过。 :) –