THEMA about_Jobs KURZBESCHREIBUNG Enthält Informationen zur Hintergrundausführung von Befehlen oder Ausdrücken durch Windows PowerShell-Hintergrundaufträge, ohne mit der aktuellen Sitzung zu interagieren. DETAILBESCHREIBUNG In diesem Thema wird erklärt, wie Hintergrundaufträge in Windows PowerShell auf einem lokalen Computer ausgeführt werden. Weitere Informationen zum Ausführen von Hintergrundaufträgen auf Remotecomputern finden Sie unter "about_Remote_Jobs". Wenn Sie einen Hintergrundauftrag starten, kann die Eingabeaufforderung auch dann sofort wieder verwendet werden, wenn die Ausführung des Auftrags mehr Zeit in Anspruch nimmt. Während der Auftrag ausgeführt wird, können Sie weiterhin ohne Unterbrechung in der Sitzung arbeiten. Wichtig: Für Hintergrundaufträge, die mit Start-Job oder dem AsJob-Parameter von Invoke-Command gestartet werden, ist die Windows PowerShell-Remotinginfrastruktur erforderlich. Diese Features können Sie nur verwenden, wenn Windows PowerShell für Remoting konfiguriert wurde. Dies gilt auch dann, wenn der Hintergrundauftrag lediglich auf dem lokalen Computer ausgeführt wird. Weitere Informationen finden Sie unter "about_Remote_Require ments". SO STARTEN SIE EINEN AUFTRAG AUF DEM LOKALEN COMPUTER Verwenden Sie das Cmdlet "Start-Job", um einen Hintergrundauftrag auf dem lokalen Computer zu starten. Wenn Sie den Befehl "Start-Job" erstellen, schließen Sie den Befehl, mit dem der Auftrag ausgeführt wird, in geschweifte Klammern ({}) ein. Geben Sie den Befehl im ScriptBlock-Parameter an. Mit dem folgenden Befehl wird ein Hintergrundauftrag gestartet, mit dem auf dem lokalen Computer der Befehl "Get-Process" ausgeführt wird. start-job -scriptblock {get-process} Der Befehl "Start-Job" gibt ein Objekt zurück, das den Auftrag darstellt. Das Auftragsobjekt enthält nützliche Informationen über den Auftrag, jedoch keine Auftragsergebnisse. Speichern Sie das Auftragsobjekt in einer Variablen, und verwenden Sie diese dann in den anderen Job-Cmdlets, um den Hintergrundauftrag zu verwalten. Mit dem folgenden Befehl wird ein Auftragsobjekt gestartet und das resultierende Auftragsobjekt in der Variablen "$job" gespeichert. $job = start-job -scriptblock {get-process} Mit dem Cmdlet "Get-Job" können Sie auch die Objekte abrufen, die die in der aktuellen Sitzung gestarteten Aufträge darstellen. Get-Job gibt dasselbe Auftragsobjekt wie Start-Job zurück. ABRUFEN VON AUFTRAGSOBJEKTEN Zum Abrufen der Objekte, die die in der aktuellen Sitzung gestarteten Hintergrundaufträge darstellen, verwenden Sie das Cmdlet "Get-Job". Ohne Parameter gibt Get-Job alle Aufträge zurück, die in der aktuellen Sitzung gestartet wurden. Mit dem folgenden Befehl rufen Sie z. B. die Aufträge in der aktuellen Sitzung ab. get-job Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Running True localhost get-process Sie können auch das Auftragsobjekt in einer Variablen speichern und diese verwenden, um den Auftrag in einem späteren Befehl darzustellen. Mit dem folgenden Befehl wird der Auftrag mit der ID "1" abgerufen und in der Variablen "$job" gespeichert. $job = get-job -id 1 Das Auftragsobjekt enthält den Status des Auftrags, der angibt, ob der Auftrag beendet wurde. Ein abgeschlossener Auftrag besitzt den Status "Complete" oder "Failed". Ein Auftrag kann auch blockiert oder ausgeführt werden. get-job Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost get-process ABRUFEN VON AUFTRAGSERGEBNISSEN Beim Ausführen eines Hintergrundauftrags werden die Ergebnisse nicht sofort angezeigt. Stattdessen gibt das Cmdlet "Start-Job" ein Auftragsobjekt zurück, das den Auftrag darstellt, jedoch keine Ergebnisse enthält. Um die Ergebnisse eines Hintergrundauftr ags abzurufen, verwenden Sie das Cmdlet "Receive-Job". Im folgenden Befehl werden die Ergebnisse des Auftrags mit dem Cmdlet "Receive-Job" abgerufen. Dabei wird zum Bezeichnen des Auftrags ein in der Variablen "$job" gespeichertes Auftragsobjekt verwendet. receive-job -job $job Das Cmdlet "Receive-Job" gibt die Ergebnisse des Auftrags zurück. Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec 668 7 2672 6168 104 32.26 488 csrss ... Sie können auch die Ergebnisse eines Auftrags in einer Variablen speichern. Im folgenden Befehl werden die Ergebnisse des Auftrags in der Variablen "$job" in der Variablen "$results" gespeichert. $results = receive-job -job $job Sie können zudem die Ergebnisse des Auftrags in einer Datei speichern, indem Sie den Umleitungsoperator (>) oder das Cmdlet "Out-File" verwenden. Im folgenden Befehl wird der Umleitungsoperator zum Speichern der Ergebnisse des Auftrags in der Variablen "$job" in der Datei "Ergebnisse.txt" verwendet. receive-job -job $job > Ergebnisse.txt ABRUFEN UND BEIBEHALTEN PARTIELLER AUFTRAGSERGEBNISSE Das Cmdlet "Receive-Job" gibt die Ergebnisse eines Hintergrundauft rags zurück. Wenn der Auftrag abgeschlossen ist, gibt Receive-Job die vollständigen Ergebnisse des Auftrags zurück. Wenn der Auftrag noch immer ausgeführt wird, werden mit Receive-Job die bis dahin generierten Ergebnisse abgerufen. Sie können Receive-Job-Befehle erneut ausführen, um die verbleibenden Ergebnisse abzurufen. Wenn Receive-Job Ergebnisse zurückgibt, werden standardmäßig die Ergebnisse in dem Cache gelöscht, in dem die Auftragsergebnisse gespeichert werden. Wenn Sie einen anderen Receive-Job-Befehl ausführen, rufen Sie nur die Ergebnisse ab, die noch nicht empfangen wurden. Mit den folgenden Befehlen werden die Ergebnisse der Ausführung von Receive-Job-Befehlen angezeigt, bevor der Auftrag abgeschlossen ist. C:\PS> receive-job -job $job Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec C:\PS> receive-job -job $job Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 68 3 2632 664 29 0.36 1388 ccmsetup 749 22 21468 19940 203 122.13 3644 communicator 905 7 2980 2628 34 197.97 424 csrss 1121 25 28408 32940 174 430.14 3048 explorer Um zu verhindern, dass die zurückgegebenen Auftragsergebnisse von Receive-Job gelöscht werden, verwenden Sie den Keep-Parameter. In diesem Fall gibt Receive-Job alle Ergebnisse zurück, die bis zu diesem Zeitpunkt generiert wurden. Die folgenden Befehle zeigen veranschaulichen die Auswirkungen, wenn der Keep-Parameter für einen Auftrag verwendet wird, der noch nicht abgeschlossen wurde. C:\PS> receive-job -job $job -keep Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec C:\PS> receive-job -job $job -keep Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 103 4 11328 9692 56 1176 audiodg 804 14 12228 14108 100 101.74 1740 CcmExec 68 3 2632 664 29 0.36 1388 ccmsetup 749 22 21468 19940 203 122.13 3644 communicator 905 7 2980 2628 34 197.97 424 csrss 1121 25 28408 32940 174 430.14 3048 explorer WARTEN AUF ERGEBNISSE Wenn Sie einen Befehl ausführen, für dessen Abschluss längere Zeit benötigt wird, können Sie anhand der Eigenschaften des Auftragsobjekts ermitteln, wann der Auftrag abgeschlossen wird. Im folgenden Befehl verwenden Sie das Get-Job-Objekt, um alle Hintergrundaufträge in der aktuellen Sitzung abzurufen. get-job Die Ergebnisse werden in einer Tabelle angezeigt. Der Status des Auftrags wird in der Statusspalte angezeigt. Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost get-process 2 Job2 Running True localhost get-eventlog -log syst... 3 Job3 Complete True localhost dir -path c:\* -recurse In diesem Fall zeigt die State-Eigenschaft, dass Auftrag 2 immer noch ausgeführt wird. Wenn Sie das Cmdlet "Receive-Job" verwenden, um die Auftragsergebnisse jetzt abzurufen, sind die Ergebnisse unvollständig. Mit dem Cmdlet "Receive-Job" können Sie alle Ergebnisse beliebig oft abrufen. Bei der ersten Verwendung erhalten Sie standardmäßig nur die Ergebnisse, die nicht bereits empfangen wurden, doch können Sie die Ergebnisse mit dem Keep-Parameter des Cmdlets "Receive-Job" beibehalten, auch wenn sie bereits empfangen wurden. Zu diesem Zeitpunkt können Sie die Ergebnisse in eine Datei schreiben und die später empfangenen Ergebnisse dann jeweils anfügen. Sie können auch warten und den Status des Auftrags später überprüfen. Zudem können Sie mit dem Cmdlet "Wait-Job" auf beliebige oder alle Ergebnisse des Auftrags zu warten. Mit Wait-Job können Sie auf den Abschluss eines bestimmten Auftrags, aller Aufträge oder beliebiger Aufträge warten. Im folgenden Befehl wird das Cmdlet "Wait-Job" verwendet, um auf einen Auftrag mit der ID "10" zu warten. wait-job -ID 10 Daher wird die Windows PowerShell-Eingabeaufforderung unterdrückt, bis der Auftrag abgeschlossen wurde. Sie können das Warten auch auf einen bestimmten Zeitraum festlegen. In diesem Befehl wird das Warten mit dem Timeout-Parameter auf 120 Sekunden beschränkt. Nach Ablauf dieser Zeit kann die Eingabeaufforderung wieder verwendet werden, aber der Auftrag wird im Hintergrund weiter ausgeführt. wait-job -ID 10 -timeout 120 BEENDEN VON AUFTRÄGEN Zum Beenden eines Hintergrundauftrags verwenden Sie das Cmdlet "Stop-Job". Mit dem folgenden Befehl wird ein Auftrag gestartet, um jeden Eintrag im Systemereignisprotokoll abzurufen. Dabei wird das Auftragsobjekt in der Variablen "$job" gespeichert. $job = start-job -scriptblock {get-eventlog -log system} Mit dem folgenden Befehl wird der Auftrag beendet. Mit einem Pipelineoperator (|) wird der Auftrag in der Variablen "$job" an Stop-Job gesendet. $job | stop-job LÖSCHEN VON AUFTRÄGEN Zum Löschen eines Hintergrundauftrags verwenden Sie das Cmdlet "Remove-Job". Mit dem folgenden Befehl wird der Auftrag in der Variablen "$job" gelöscht. remove-job -job $job UNTERSUCHEN FEHLERHAFTER AUFTRÄGE Wenn Sie ermitteln möchten, wieso bei einem Auftrag Fehler aufgetreten sind, verwenden Sie die untergeordnete Reason-Eigensch aft des Auftragsobjekts. Mit dem folgenden Befehl wird ein Auftrag ohne die erforderlichen Anmeldeinformationen gestartet. Dabei wird das Auftragsobjekt in der Variablen "$job" gespeichert. $job = start-job -scriptblock {new-item -path HKLM:\Software\ MyCompany} Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 Job1 Failed False localhost new-item -path HKLM:\S... Mit dem folgenden Befehl wird die Reason-Eigenschaft verwendet, um den Fehler zu suchen, der zum Fehler beim Auftrag geführt hat. $job.ChildJobs[0].JobStateInfo.Reason In diesem Fall wurde der Auftrag nicht erfolgreich ausgeführt, weil zum Ausführen des Befehls auf dem Remotecomputer explizite Anmeldeinformationen erforderlich waren. Der Wert der Reason-Eigenschaft ist: Mit dem Remoteserver konnte keine Verbindung hergestellt werden. Folgende Fehlermeldung wurde ausgegeben: Zugriff verweigert. DIE JOB-CMDLETS Start-Job Startet einen Hintergrundauftrag auf einem lokalen Computer. Get-Job Ruft die Hintergrundaufträge ab, die in der aktuellen Sitzung gestartet wurden. Receive-Job Ruft die Ergebnisse von Hintergrundaufträgen ab. Stop-Job Beendet einen Hintergrundauftrag. Wait-Job Unterdrückt die Eingabeaufforderung, bis ein oder alle Aufträge abgeschlossen wurden. Remove-Job Löscht einen Hintergrundauftrag. Invoke-Command Bei Verwendung des AsJob-Parameters wird jeder Befehl auf einem Remotecomputer als Hintergrundauftrag ausgeführt. Mit Invoke-Command können Sie auch jeden Auftragsbefehl remote ausführen, u. a. den Befehl "Start-Job". SIEHE AUCH about_Remote_Jobs about_Job_Details about_Remote about_PSSessions Start-Job Get-Job Receive-Job Stop-Job Wait-Job Remove-Job Invoke-Command