about_Job_Details

Letzte Aktualisierung: Mai 2014

Betrifft: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

THEMA

about_Job_Details

KURZE BESCHREIBUNG

Enthält Details zu Hintergrundaufträgen auf lokalen Computern und Remotecomputern.

AUSFÜHRLICHE BESCHREIBUNG

In diesem Thema wird das Konzept des Hintergrundauftrags erläutert. Außerdem enthält es technische Informationen über die Funktionsweise von Hintergrundaufträgen in Windows PowerShell®.

Dieses Thema ist eine Ergänzung zu den Themen „About_Jobs“ und „About_Remote_Jobs“.

INFORMATIONEN ZU HINTERGRUNDAUFTRÄGEN

Ein Hintergrundauftrag führt einen Befehl oder Ausdruck asynchron aus. Er könnte ein Cmdlet, eine Funktion, ein Skript oder andere befehlszeilenbasierte Aufgaben ausführen. Er ist dafür vorgesehen, Befehle auszuführen, die längere Zeit in Anspruch nehmen, jedoch können Sie damit jeden Befehl im Hintergrund ausführen.

Bei der Ausführung eines synchronen Befehls wird die Eingabeaufforderung von Windows PowerShell unterdrückt, bis der Befehl ausgeführt wurde. Aber ein Hintergrundauftrag unterdrückt nicht die Eingabeaufforderung von Windows PowerShell. Ein Befehl zum Starten eines Hintergrundauftrags gibt ein Auftragsobjekt zurück. Die Eingabeaufforderung kehrt sofort zurück, sodass Sie während der Ausführung des Hintergrundauftrags andere Aufgaben bearbeiten können.

Allerdings erhalten Sie bei einem Hintergrundauftrag die Ergebnisse selbst dann nicht sofort, wenn der Auftrag sehr schnell ausgeführt wird. Das zurückgegebene Auftragsobjekt enthält nützliche Informationen zum Auftrag, aber keine Auftragsergebnisse. Sie müssen einen separaten Befehl ausführen, um die Auftragsergebnisse abzurufen. Sie können auch Befehle ausführen, um den Auftrag zu beenden, zu warten, bis der Auftrag abgeschlossen ist, und um den Auftrag zu löschen.

Damit der zeitliche Ablauf eines Hintergrundauftrags von anderen Befehlen unabhängig ist, wird jeder Hintergrundauftrag in einer eigenen Windows PowerShell-Umgebung (einer „Sitzung“) ausgeführt. Allerdings kann dies eine vorübergehende Verbindung sein, die nur zum Ausführen des Auftrags erstellt und anschließend zerstört wird, oder eine persistente Sitzung (eine PSSession), die Sie zur Ausführung mehrerer verwandter Aufträge oder Befehle verwenden können.

VERWENDEN DER AUFTRAG-CMDLETS

Starten Sie einen Hintergrundauftrag auf einem lokalen Computer mit einem Start-Job-Befehl. „Start-Job“ gibt ein Auftragsobjekt zurück. Sie können auch Objekte abrufen, die die Aufträge darstellen, die mit dem Cmdlet „Get-Job“ auf dem lokalen Computer gestartet wurden.

Um die Auftragsergebnisse abzurufen, verwenden Sie den Befehl „Receive-Job“. Wenn der Auftrag nicht abgeschlossen ist, gibt „Receive-Job“ Teilergebnisse zurück. Sie können auch das Wait-Job-Cmdlet verwenden, um die Eingabeaufforderung zu unterdrücken, bis einer oder alle Aufträge, die in der Sitzung gestartet wurden, abgeschlossen sind.

Zum Stoppen eines Hintergrundauftrags verwenden Sie das Stop-Job-Cmdlet. Zum Löschen eines Auftrags verwenden Sie das Remove-Job-Cmdlet.

Weitere Informationen über die Funktionsweise der Cmdlets finden Sie im Hilfethema für jedes Cmdlet und unter „About_Jobs“.

STARTEN VON HINTERGRUNDAUFTRÄGEN AUF REMOTECOMPUTERN

Sie können Hintergrundaufträge auf einem lokalen oder Remotecomputer erstellen und verwalten. Um einen Hintergrundauftrag remote auszuführen, verwenden Sie den AsJob-Parameter eines Cmdlets, wie z. B. „Invoke-Command“, oder verwenden Sie das Cmdlet „Invoke-Command“ für die Remoteausführung eines Start-Job-Befehls. Sie können einen Hintergrundauftrag auch in einer interaktiven Sitzung starten.

Weitere Informationen zu Remotehintergrundaufträgen finden Sie unter „about_Remote_Jobs“.

UNTERGEORDNETE AUFTRÄGE

Jeder Hintergrundauftrag besteht aus einem übergeordneten Auftrag und einem oder mehreren untergeordneten Aufträgen. In Aufträgen, die mithilfe des Start-Job- oder AsJob-Parameters von „Invoke-Command“ gestartet werden, hat der übergeordnete Auftrag die Führungsfunktion. Er führt weder Befehle aus, noch gibt er Ergebnisse zurück. Die Befehle werden tatsächlich von den untergeordneten Aufträgen ausgeführt. (Von anderen Cmdlets gestartete Aufträgen funktionieren möglicherweise anders.)

Die untergeordneten Aufträge werden in der ChildJobs-Eigenschaft des übergeordneten Auftragsobjekts gespeichert. Die ChildJobs-Eigenschaft kann ein oder mehrere untergeordnete Auftragsobjekte enthalten. Die untergeordneten Auftragsobjekte haben einen Namen, eine ID und eine Instanz-ID, die vom übergeordneten Auftrag abweichen, damit Sie die übergeordneten und untergeordneten Aufträge einzeln oder als Einheit verwalten können.

Um die über- und untergeordneten Aufträge eines Auftrags abzurufen, verwenden Sie den IncludeChildJobs-Parameter des Cmdlets „Get-Job“. Der Parameter „IncludeChildJob“ wurde in Windows PowerShell 3.0 eingeführt.

        C:\PS> Get-Job -IncludeChildJob

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        1     Job1   RemoteJob     Failed     True          localhost   Get-Process
        2     Job2                 Completed  True          Server01    Get-Process
        3     Job3                 Failed     False         localhost   Get-Process

Um den übergeordneten Auftrag und nur die untergeordneten Aufträge mit einem bestimmten Statuswert abzurufen, verwenden Sie den ChildJobState-Parameter des Cmdlets „Get-Job“. Der Parameter „ChildJobState “ wurde in Windows PowerShell 3.0 eingeführt.

        C:\PS> Get-Job -ChildJobState Failed

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        1     Job1   RemoteJob     Failed     True          localhost   Get-Process
        3     Job3                 Failed     False         localhost   Get-Process

Um die untergeordneten Aufträge eines Auftrags in allen Versionen von Windows PowerShell abzurufen, verwenden Sie die ChildJob-Eigenschaft des übergeordneten Auftrags.

        C:\PS> (Get-Job Job1).ChildJobs

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        2     Job2                 Completed  True          Server01    Get-Process
        3     Job3                 Failed     False         localhost   Get-Process

Sie können auch einen Get-Job-Befehl für den untergeordneten Auftrag verwenden, wie im folgenden Befehl gezeigt:

        C:\PS> Get-Job Job3

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        3     Job3                 Failed     False         localhost   Get-Process

Die Konfiguration des untergeordneten Auftrags hängt von dem Befehl ab, den Sie verwenden, um den Auftrag zu starten.

Wenn Sie „Start-Job“ zum Starten eines Auftrags auf einem lokalen Computer verwenden, besteht der Auftrag aus einem übergeordneten Auftrag mit Führungsfunktion und einem untergeordneten Auftrag, der den Befehl ausführt.

Wenn Sie den AsJob-Parameter von „Invoke-Command“ verwenden, um einen Auftrag auf einem oder mehreren Computern zu starten, besteht der Auftrag aus einem übergeordneten Auftrag mit Führungsfunktion und einem untergeordneten Auftrag für jeden Auftrag, der auf jedem Computer ausgeführt wird.

Wenn Sie „Invoke-Command“ verwenden, um einen Start-Job-Befehl auf einem oder mehreren Remotecomputern auszuführen, entspricht das Ergebnis einer lokalen Befehlsausführung auf jedem Remotecomputer. Der Befehl gibt ein Auftragsobjekt für jeden Computer zurück. Das Auftragsobjekt besteht aus einem übergeordneten Auftrag mit Führungsfunktion und einem untergeordneten Auftrag, der den Befehl ausführt.

Der übergeordnete Auftrag stellt alle untergeordneten Aufträge dar. Beim Verwalten eines übergeordneten Auftrags verwalten Sie auch die zugehörigen untergeordneten Aufträge. Wenn Sie einen übergeordneten Auftrag beenden, werden z. B. alle untergeordneten Aufträge beendet. Wenn Sie die Ergebnisse eines übergeordneten Auftrags abrufen, erhalten Sie die Ergebnisse aller untergeordneten Aufträge.

Sie können jedoch auch untergeordnete Aufträge einzeln verwalten. Dies ist besonders hilfreich, wenn Sie ein Problem mit einem Auftrag untersuchen möchten, oder nur die Ergebnisse eines von mehreren gestarteten untergeordneten Aufträgen erhalten, wenn Sie den AsJob-Parameter von „Invoke-Command“ verwenden. (Das Hochkommazeichen [`] ist das Fortsetzungszeichen.)

Der folgende Befehl verwendet den AsJob-Parameter von „Invoke-Command“, um Hintergrundaufträge auf dem lokalen Computer und zwei Remotecomputern zu starten. Der Befehl speichert den Auftrag in der Variablen „$j“.

        PS C:> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
               -Command {Get-Date} -AsJob

Wenn Sie die Eigenschaften „Name“ und „ChildJob“ des Auftrags in „$j“ anzeigen, wird sichtbar, dass der Befehl ein Auftragsobjekt mit drei untergeordneten Aufträgen, einem für jeden Computer, zurückgegeben hat.

        CPS C:> $j | Format-List Name, ChildJobs

        Name      : Job3
        ChildJobs : {Job4, Job5, Job6}

Wenn Sie den übergeordneten Auftrag anzeigen, wird sichtbar, dass der Auftrag fehlgeschlagen ist.

        C:\PS> $j

        Id    Name   PSJobTypeName State      HasMoreData   Location    
        --    ----   ------------- -----      -----------   --------   
        3     Job3   RemotingJob   Failed     False         localhost,Server...

Aber wenn Sie einen Get-Job-Befehl ausführen, der die untergeordneten Aufträge abruft, zeigt die Ausgabe, dass nur ein untergeordneter Auftrag fehlgeschlagen ist.

        PS C:\> Get-Job -IncludeChildJobs

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        3     Job3   RemotingJob   Failed     False         localhost,Server...
        4     Job4                 Completed  True          localhost   Get-Date
        5     Job5                 Failed     False         Server01    Get-Date
        6     Job6                 Completed  True          Server02    Get-Date

Um die Ergebnisse aller untergeordneten Aufträge abzurufen, verwenden Sie das Receive-Job-Cmdlet, um die Ergebnisse des übergeordneten Auftrags abzurufen. Sie können jedoch auch die Ergebnisse eines bestimmten untergeordneten Auftrags abrufen, wie im Folgenden dargestellt.

        C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto

        ComputerName DateTime
        ------------ --------
        Server02     Thursday, March 13, 2008 4:16:03 PM

Das Feature der untergeordneten Aufträge von Windows PowerShell-Hintergrundaufträgen gibt Ihnen mehr Kontrolle über die Aufträge, die Sie ausführen.

AUFTRAGSTYPEN

Windows PowerShell unterstützt verschiedene Typen von Aufträgen für verschiedene Aufgaben. Ab Windows PowerShell 3.0 können Entwickler „Auftragsquelladapter“ schreiben, die Windows PowerShell neue Auftragstypen hinzufügen und die Auftragsquelladapter in Module einbeziehen. Beim Importieren des Moduls können Sie den neuen Auftragstyp in der Sitzung verwenden.

Beispielsweise fügt das Modul „PSScheduledJob“ geplante Aufträge hinzu, und das Modul „PSWorkflow“ fügt Workflowaufträge hinzu.

Benutzerdefinierte Auftragstypen unterscheiden sich möglicherweise deutlich von standardmäßigen Windows PowerShell-Hintergrundaufträgen. Beispielsweise werden geplante Aufträge auf dem Datenträger gespeichert. Sie sind nicht nur in einer bestimmten Sitzung vorhanden. Workflowaufträge können angehalten und fortgesetzt werden.

Die Cmdlets, mit denen Sie benutzerdefinierte Aufträge verwalten, hängen vom Auftragstyp ab. Für einige verwenden Sie die standardmäßigen Cmdlets für Aufträge, wie „Get-Job“ und „Start-Job“. Andere verfügen über spezielle Cmdlets, die nur einen bestimmten Auftragstyp verwalten. Ausführliche Informationen zu benutzerdefinierten Auftragstypen finden Sie in den Hilfethemen zum jeweiligen Auftragstyp.

Um den Auftragstyp eines Auftrags zu ermitteln, verwenden Sie das Cmdlet „Get-Job“. „Get-Job“ gibt unterschiedliche Auftragsobjekte für verschiedene Auftragstypen zurück. Der Wert der Eigenschaft „PSJobTypeName“ des Auftragsobjekts, den „Get-Job“ zurückgibt, gibt den Auftragstyp an.

Die folgende Tabelle enthält die Auftragstypen, die im Umfang von Windows PowerShell enthalten sind.

      Job Type         Description
      --------         -----------
      BackgroundJob    Started by using the Start-Job cmdlet.
      RemoteJob        Started by using the AsJob parameter of the 
                       Invoke-Command cmdlet.
      PSWorkflowJob    Started by using the AsJob parameter of a
                       workflow.
      PSScheduledJob   An instance of a scheduled job started by
                       a job trigger.
      CIMJob           Started by using the AsJob parameter of 
                       a cmdlet from a CDXML module.
      WMIJob           Started by using the AsJob parameter of 
                       a cmdlet from a WMI module.
      PSEventJob       Created by running Register-ObjectEvent 
                       and specifying an action with the Action
                       parameter.

HINWEIS:

Bevor Sie das Cmdlet „Get-Job“ verwenden, um Aufträge eines bestimmten Typs abzurufen, stellen Sie sicher, dass das Modul, das den Auftragstyp hinzufügt, in die aktuelle Sitzung importiert wird. Andernfalls ruft „Get-Job“ nicht Aufträge dieses Typs ab.

BEISPIEL

Die folgenden Befehle erstellen einen lokalen Hintergrundauftrag, einen Remotehintergrundauftrag, einen Workflowauftrag und einen geplanten Auftrag. Anschließend werden die Aufträge mit dem Cmdlet „Get-Job“ abgerufen. „Get-Job“ ruft den geplanten Auftrag nicht ab, aber alle gestarteten Instanzen des geplanten Auftrags werden abgerufen.

    # Start a background job on the local computer.
    PS C:\> Start-Job -Name LocalData {Get-Process}

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    LocalData   BackgroundJob   Running        True     localhost  Get-Process
    # Start a background job that runs on a remote computer.
    PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    RemoteData  RemoteJob       Running        True     Server01   Get-Process
    # Create a scheduled job
    PS C:\>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock {Get-Process} `
             -Trigger (New-JobTrigger -Once -At "3 PM")

    Id         Name            JobTriggers     Command       Enabled
    --         ----            -----------     -------       -------
    1          ScheduledJob    1               Get-Process   True
    # Create a workflow. 
    PS C:\> workflow Test-Workflow {Get-Process}

    # Run the workflow as a job.
    PS C:\> Test-Workflow -AsJob -JobName TestWFJob

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    TestWFJob   PSWorkflowJob   NotStarted     True     localhost  Get-Process
    # Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
      instances of the scheduled job that are started.

    PS C:\> Get-Job

    Id   Name         PSJobTypeName   State     HasMoreData     Location  Command
    --   ----         -------------   -----     -----------     --------  -------
    2    LocalData    BackgroundJob   Completed True            localhost Get-Process
    4    RemoteData   RemoteJob       Completed True            Server01  Get-Process
    6    TestWFJob    PSWorkflowJob   Completed True            localhost WorkflowJob
    8    ScheduledJob PSScheduledJob  Completed True            localhost Get-Process
    # To get scheduled jobs, use the Get-ScheduledJob cmdlet.
    PS C:\> Get-ScheduledJob

    Id         Name            JobTriggers     Command       Enabled
    --         ----            -----------     -------       -------
    1          ScheduledJob    1               Get-Process   True

SIEHE AUCH

about_Jobs

about_Remote_Jobs

about_Remote

about_Scheduled_Jobs

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

Suspend-Job

Resume-Job

New-PSSession

Enter-PSSession

Exit-PSSession

Register-ScheduledJob

„Get-ScheduleJob“