2017-05-31 5 views
0

Benötigt, um meinen Code von Direct Call zu Start-Job-Verfahren aufgrund von Timeouts durch Symantec Antivirus (SEP) v14 zu ändern, mein Skript hängen.Empfangs-Job anders als Direktanruf

diese Schnapp funktioniert gut, so lange:

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

Der Wechsel zu einem Start-Job preocedure vermasselt vollständig das resultierende Objekt auf. im googeln und Prüfung für zwei Tage jetzt aber nicht herausfinden kann, was so complicatet mit Job Objekten im Umgang:

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 

Allerdings bin ich nicht in der Lage das gleiche Ergebnis zu erhalten zurück Receive-Job verwenden. Ich bekomme immer ein verdrahtetes Job-Objekt, und ich kann die Daten nicht einfach so extrahieren, wie es vorher war. Warum ist das Ergebnis so komplett anders? Ist es möglich, nur die Daten in einem Objekt, wie es zuvor war, anstatt eines Jobobjekts zurück zu bekommen?

btw. Diese interessanten Artikel nicht lösen mein Problem: https://learn-powershell.net/2014/06/27/quick-hits-did-i-really-lose-my-output-with-receive-job-by-not-usingkeep/

Vielen Dank für Ihre Antworten im Voraus

+1

Ihr Code funktioniert. Erstens, in der Funktion, die Sie nicht 'Objektnamen wählen' wählen, so erhalten Sie auch andere Eigenschaften - RunspaceId, Group, etc. Zweitens, die Ausgabe von 'wait-job' wird auch von Ihrer Funktion ausgegeben, und Sie wollen wahrscheinlich ' Wait-Job $ job -Timeout $ timeout | Out-Null, um es zum Schweigen zu bringen. Aber die Ergebnisse von Get-HotFix werden von Ihrer Funktion zurückgegeben ... – TessellatingHeckler

+0

Danke @TesselingHeckler 'Wait-Job $ job -Timeout $ timeout | Out-Null hat das Problem wirklich gelöst! Die Ausgabe wurde das zurückkehrende Objekt durcheinander gebracht, ich habe dieses Verhalten nie in Betracht gezogen. Leider ist es nicht allgemein dokumentiert und gefährlich! –

Antwort

0

Die Frage, was Sie haben, werden nicht wegen des Codes. Es ist, weil Start-Job oder jede PS-Job-Sitzung im Grunde alle Details, Eigenschaften, die mit diesem Job verbunden sind.

So kann ich im ersten Fall sehen Sie haben eine Gruppierung und schließlich nur die Name, die nicht im späteren Fall ist.

Also würde ich vorschlagen, dass Sie das zur Funktion auch hinzufügen.

Noch eine Sache, Wait-Job wird auch den Wert in der Konsole ausgeben. Entweder redirect oder pipe es auf null, um dies zu vermeiden.

Sie können den Auftrag auch mit empfange-job mit der Job-ID oder dem Namen empfangen. Ich denke, das wird besser. Überprüfen Sie einfach den Status des Jobs. Sobald fertig, empfange es.

+0

danke! 'Wait-Job $ job -Timeout $ timeout | Out-Null hat mein Objekt-Chaos gelöst! Nach der Gruppierung habe ich die Attribute 'Count, Name, Group' in meinem Objekt. Daher denke ich, nur die eindeutigen Werte von 'Name' zu ​​verwenden. –

+0

Ich denke, Sie sollten die Antwort von TessellatingHeckler akzeptieren. Ich habe es später bemerkt. Er hat genauer gesagt. :) –