Freigeben über


Über Jobs

KURZE BESCHREIBUNG

Enthält Informationen dazu, wie PowerShell-Hintergrundaufträge einen Befehl oder Ausdruck im Hintergrund ausführen, ohne mit der aktuellen Sitzung zu interagieren.

LANGE BESCHREIBUNG

In diesem Thema wird erläutert, wie Hintergrundaufträge in PowerShell auf einem lokalen Computer ausgeführt werden. Informationen zum Ausführen von Hintergrundaufträgen auf Remotecomputern finden Sie unter about_Remote_Jobs.

Wenn Sie einen Hintergrundauftrag starten, wird die Eingabeaufforderung sofort zurückgegeben, auch wenn der Auftrag eine längere Zeit für den Abschluss benötigt. Sie können weiterhin in der Sitzung ohne Unterbrechung arbeiten, während der Auftrag ausgeführt wird.

DIE AUFTRAGS-CMDLETS

Cmdlet BESCHREIBUNG
Start-Job Startet einen Hintergrundauftrag auf einem lokalen Computer.
Get-Job Ruft die Hintergrundjobs ab, die im
Aktuelle Sitzung.
Receive-Job Ruft die Ergebnisse von Hintergrundaufträgen ab.
Stop-Job Stoppt einen Hintergrundjob.
Wait-Job Unterdrückt die Eingabeaufforderung, bis ein oder alle Aufträge
vollständig.
Remove-Job Löscht einen Hintergrundjob.
Invoke-Command Der AsJob-Parameter führt einen beliebigen Befehl als Hintergrund aus
auf einem Remote-Computer. Sie können auch verwenden
Invoke-Command um einen beliebigen Jobbefehl remote auszuführen,
einschließlich eines Start-Job Befehls.

SO STARTEN SIE EINEN AUFTRAG AUF DEM LOKALEN COMPUTER

Um einen Hintergrundauftrag auf dem lokalen Computer zu starten, verwenden Sie das Cmdlet Start-Job.

Um einen Start-Job Befehl zu schreiben, schließen Sie den Befehl, den der Auftrag ausführt, in geschweifte Klammern ( { } ) ein. Verwenden Sie den Parameter ScriptBlock, um den Befehl anzugeben.

Der folgende Befehl startet einen Hintergrundauftrag, der einen Get-Process Befehl auf dem lokalen Computer ausführt.

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, aber nicht die Auftragsergebnisse.

Speichern Sie das Auftragsobjekt in einer Variablen, und verwenden Sie es dann mit den anderen Job-Cmdlets, um den Hintergrundauftrag zu verwalten. Der folgende Befehl startet ein Auftragsobjekt und speichert das resultierende Auftragsobjekt in der Variablen $job.

$job = Start-Job -ScriptBlock {Get-Process}

Sie können das Get-Job Cmdlet auch verwenden, um Objekte abzurufen, die die in der aktuellen Sitzung gestarteten Aufträge darstellen. Get-Job Gibt das gleiche Auftragsobjekt zurück, das Start-Job zurückgibt.

ABRUFEN VON AUFTRAGSOBJEKTEN

Verwenden Sie das Cmdlet, um Get-Job Objekte abzurufen, die die Hintergrundaufträge darstellen, die in der aktuellen Sitzung gestartet wurden. Ohne Parameter gibt Get-Job alle Aufträge zurück, die in der aktuellen Sitzung gestartet wurden.

Mit dem folgenden Befehl werden z. B. die Aufträge in der aktuellen Sitzung abgerufen.

PS C:> Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Running    True         localhost  Get-Process

Sie können das Auftragsobjekt auch in einer Variablen speichern und sie 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 abgeschlossen ist. Ein abgeschlossener Auftrag hat den Status "Abgeschlossen" oder "Fehlgeschlagen". Ein Auftrag kann auch blockiert sein oder ausgeführt werden.

Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

ABRUFEN DER ERGEBNISSE EINES AUFTRAGS

Wenn Sie einen Hintergrundauftrag ausführen, werden die Ergebnisse nicht sofort angezeigt. Stattdessen gibt das Cmdlet Start-Job ein Auftragsobjekt zurück, das den Auftrag darstellt, aber nicht die Ergebnisse enthält. Verwenden Sie das Cmdlet Receive-Job, um die Ergebnisse eines Hintergrundauftrags abzurufen.

Der folgende Befehl verwendet das Cmdlet Receive-Job, um die Ergebnisse des Auftrags abzurufen. Es verwendet ein Auftragsobjekt, das in der Variablen $job gespeichert ist, um den Auftrag zu identifizieren.

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 die Ergebnisse eines Auftrags auch in einer Variablen speichern. Mit dem folgenden Befehl werden die Ergebnisse des Auftrags in der Variablen $job in der Variablen $results gespeichert.

$results = Receive-Job -Job $job

Außerdem können Sie die Ergebnisse des Auftrags in einer Datei speichern, indem Sie den Umleitungsoperator (>) oder das Cmdlet Out-File verwenden. Der folgende Befehl verwendet den Umleitungsoperator, um die Ergebnisse des Auftrags in der Variablen $job in der Results.txt Datei zu speichern.

Receive-Job -Job $job > results.txt

ABRUFEN UND AUFBEWAHREN VON TEILERGEBNISSEN

Das Cmdlet Receive-Job ruft die Ergebnisse eines Hintergrundauftrags ab. Wenn der Auftrag abgeschlossen ist, erhält Receive-Job alle Auftragsergebnisse. Wenn der Auftrag noch ausgeführt wird, erhält Receive-Job die Ergebnisse, die bisher generiert wurden. Sie können Receive-Job Befehle erneut ausführen, um die verbleibenden Ergebnisse zu erhalten.

Wenn Receive-Job Ergebnisse zurückgegeben werden, werden diese Ergebnisse standardmäßig aus dem Cache gelöscht, in dem die Auftragsergebnisse gespeichert sind. Wenn Sie einen anderen Receive-Job Befehl ausführen, erhalten Sie nur die Ergebnisse, die noch nicht empfangen wurden.

In den folgenden Befehlen werden die Ergebnisse Receive-Job Ausgeführten Befehle 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 Receive-Job , dass die zurückgegebenen Auftragsergebnisse gelöscht werden, verwenden Sie den Parameter Keep . Als Ergebnis werden alle Ergebnisse zurückgegeben, Receive-Job die bis zu diesem Zeitpunkt generiert wurden.

Die folgenden Befehle zeigen, wie sich die Verwendung des Parameters "Keep" auf einen Auftrag auswirkt, der noch nicht abgeschlossen ist.

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 DIE ERGEBNISSE

Wenn Sie einen Befehl ausführen, der eine lange Zeit dauert, können Sie die Eigenschaften des Auftragsobjekts verwenden, um zu bestimmen, wann der Auftrag abgeschlossen ist. Der folgende Befehl verwendet 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 Spalte Status angezeigt.

Id Name  PSJobTypeName State    HasMoreData Location  Command
-- ----  ------------- -----    ----------- --------  -------
1  Job1  BackgroundJob Complete True        localhost Get-Process
2  Job2  BackgroundJob Running  True        localhost Get-EventLog -Log ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

In diesem Fall gibt die State-Eigenschaft an, dass Job 2 noch ausgeführt wird. Wenn Sie das Cmdlet Receive-Job verwenden würden, um die Auftragsergebnisse jetzt abzurufen, wären die Ergebnisse unvollständig. Sie können das Cmdlet Receive-Job wiederholt verwenden, um alle Ergebnisse abzurufen. Standardmäßig erhalten Sie bei jeder Verwendung nur die Ergebnisse, die noch nicht empfangen wurden, aber Sie können den Parameter Keep des Cmdlets Receive-Job verwenden, um die Ergebnisse beizubehalten, obwohl sie bereits empfangen wurden.

Sie können die Teilergebnisse in eine Datei schreiben und dann neuere Ergebnisse anhängen, sobald sie eintreffen, oder Sie können warten und den Status des Auftrags später überprüfen.

Sie können den Wait-Parameter des Receive-Job Cmdlets verwenden, der die Eingabeaufforderung erst zurückgibt, wenn der Auftrag abgeschlossen ist und alle Ergebnisse verfügbar sind.

Sie können auch das Cmdlet Wait-Job verwenden, um auf ein oder alle Ergebnisse des Auftrags zu warten. Wait-Job Ermöglicht es Ihnen, auf einen bestimmten Auftrag, auf alle Aufträge oder auf den Abschluss eines der Aufträge zu 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 PowerShell-Eingabeaufforderung unterdrückt, bis der Auftrag abgeschlossen ist.

Sie können auch auf einen vordefinierten Zeitraum warten. Dieser Befehl verwendet den Parameter Timeout, um die Wartezeit auf 120 Sekunden zu begrenzen. Wenn die Zeit abläuft, gibt die Eingabeaufforderung zurück, aber der Auftrag wird weiterhin im Hintergrund ausgeführt.

Wait-Job -ID 10 -Timeout 120

STOPPEN EINES AUFTRAGS

Verwenden Sie das Cmdlet Stop-Job, um einen Hintergrundauftrag zu beenden. Mit dem folgenden Befehl wird ein Auftrag gestartet, um jeden Eintrag im Systemereignisprotokoll abzurufen. Das Auftragsobjekt wird in der Variablen $job gespeichert.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

Mit dem folgenden Befehl wird der Auftrag beendet. Es wird ein Pipelineoperator (|) verwendet, um den Auftrag in der Variablen $job an zu Stop-Jobsenden.

$job | Stop-Job

LÖSCHEN EINES AUFTRAGS

Verwenden Sie das Cmdlet Remove-Job, um einen Hintergrundauftrag zu löschen. Mit dem folgenden Befehl wird der Auftrag in der Variablen $job gelöscht.

Remove-Job -Job $job

UNTERSUCHEN EINES FEHLGESCHLAGENEN AUFTRAGS

Um herauszufinden, warum ein Auftrag fehlgeschlagen ist, verwenden Sie die Untereigenschaft Grund des Auftragsobjekts.

Mit dem folgenden Befehl wird ein Auftrag ohne die erforderlichen Anmeldeinformationen gestartet. Das Auftragsobjekt wird in der Variablen $job gespeichert.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Der folgende Befehl verwendet die Reason-Eigenschaft, um den Fehler zu suchen, der dazu geführt hat, dass der Auftrag fehlgeschlagen ist.

$job.ChildJobs[0].JobStateInfo.Reason

In diesem Fall ist der Auftrag fehlgeschlagen, da der Remotecomputer explizite Anmeldeinformationen zum Ausführen des Befehls benötigt hat. Der Wert der Reason-Eigenschaft lautet:

Beim Herstellen einer Verbindung mit dem Remote-Server ist die folgende Fehlermeldung fehlgeschlagen: Der Zugriff wird verweigert.

SIEHE AUCH

about_Remote_Jobs

about_Job_Details

über_Remote

about_PSSessions

Start-Job

Get-Job

Empfangen-Auftrag

Stop-Job

Warten-Job

Entfernen-Job

Invoke-Befehl