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