about_Job_Details
Kurze Beschreibung
Enthält Details zu Hintergrundaufträgen auf lokalen und Remotecomputern.
Detaillierte Beschreibung
In diesem Thema wird das Konzept eines Hintergrundauftrags erläutert und technische Informationen zur Funktionsweise von Hintergrundaufträgen in PowerShell bereitgestellt.
Dieses Thema ist eine Ergänzung zu den Themen about_Jobs, about_Thread_Jobs und about_Remote_Jobs .
Informationen zu Hintergrundaufträgen
Ein Hintergrundauftrag führt einen Befehl oder Ausdruck asynchron aus. Es kann ein Cmdlet, eine Funktion, ein Skript oder eine andere befehlsbasierte Aufgabe ausführen. Es ist für die Ausführung von Befehlen konzipiert, die einen längeren Zeitraum in Anspruch nehmen, aber Sie können es verwenden, um jeden Befehl im Hintergrund auszuführen.
Wenn ein synchroner Befehl ausgeführt wird, wird die PowerShell-Eingabeaufforderung unterdrückt, bis der Befehl abgeschlossen ist. Ein Hintergrundauftrag unterdrückt jedoch nicht die PowerShell-Eingabeaufforderung. Ein Befehl zum Starten eines Hintergrundauftrags gibt ein Auftragsobjekt zurück. Die Eingabeaufforderung wird sofort zurückgegeben, damit Sie während der Ausführung des Hintergrundauftrags an anderen Aufgaben arbeiten können.
Wenn Sie jedoch einen Hintergrundauftrag starten, erhalten Sie die Ergebnisse nicht sofort, auch wenn der Auftrag sehr schnell ausgeführt wird. Das zurückgegebene Auftragsobjekt enthält nützliche Informationen zum Auftrag, aber nicht die 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, auf den Abschluss des Auftrags zu warten und den Auftrag zu löschen.
Um die Zeitsteuerung eines Hintergrundauftrags unabhängig von anderen Befehlen zu machen, wird jeder Hintergrundauftrag in einer eigenen PowerShell-Sitzung ausgeführt. Dies kann jedoch eine temporäre Verbindung sein, die nur zum Ausführen des Auftrags erstellt und dann zerstört wird, oder es kann sich um eine persistente PSSession sein, die Sie zum Ausführen mehrerer verwandter Aufträge oder Befehle verwenden können.
Verwenden der Auftrags-Cmdlets
Verwenden Sie einen Start-Job
Befehl, um einen Hintergrundauftrag auf einem lokalen Computer zu starten.
Start-Job
gibt ein Auftragsobjekt zurück. Sie können auch Objekte abrufen, die die Aufträge darstellen, die auf dem lokalen Computer gestartet wurden, indem Sie das Get-Job
Cmdlet verwenden.
Verwenden Sie einen Receive-Job
Befehl, um die Auftragsergebnisse abzurufen. Wenn der Auftrag nicht abgeschlossen ist, Receive-Job
werden Teilergebnisse zurückgegeben. 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.
Verwenden Sie das Stop-Job
Cmdlet, um einen Hintergrundauftrag zu beenden. Verwenden Sie das Remove-Job
Cmdlet, um einen Auftrag zu löschen.
Weitere Informationen zur Funktionsweise der Cmdlets finden Sie im Hilfethema zu den einzelnen Cmdlets 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 Invoke-Command
, oder verwenden Sie das Invoke-Command
Cmdlet, um einen Start-Job
Befehl remote auszuführen. 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 mit Start-Job
oder dem AsJob-Parameter von Invoke-Command
gestartet werden, ist der übergeordnete Auftrag eine Führungskraft. Es werden keine Befehle ausgeführt und keine Ergebnisse zurückgegeben. Die Befehle werden tatsächlich von den untergeordneten Aufträgen ausgeführt. Aufträge, die mit anderen Cmdlets begonnen haben, 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 weisen einen Namen, eine ID und eine InstanceId auf, die sich vom übergeordneten Auftrag unterscheiden, sodass Sie die übergeordneten und untergeordneten Aufträge einzeln oder als Einheit verwalten können.
Verwenden Sie den IncludeChildJobs-ParameterGet-Job
des Cmdlets, um die übergeordneten und untergeordneten Aufträge eines Auftrags abzurufen. Der IncludeChildJob-Parameter wurde in Windows PowerShell 3.0 eingeführt.
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 State-Wert abzurufen, verwenden Sie den ChildJobState-Parameter des Get-Job
Cmdlets. Der Parameter ChildJobState wurde in Windows PowerShell 3.0 eingeführt.
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 PowerShell abzurufen, verwenden Sie die ChildJob-Eigenschaft des übergeordneten Auftrags.
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:
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 vom Befehl ab, den Sie zum Starten des Auftrags verwenden.
Wenn Sie verwenden
Start-Job
, um einen Auftrag auf einem lokalen Computer zu starten, besteht der Auftrag aus einem übergeordneten Auftrag einer Führungskraft 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 einer Führungskraft und einem untergeordneten Auftrag für jeden Auftrag, der auf jedem Computer ausgeführt wird.Wenn Sie verwenden
Invoke-Command
, um einenStart-Job
Befehl auf einem oder mehreren Remotecomputern auszuführen, entspricht das Ergebnis einem lokalen Befehl, der auf jedem Remotecomputer ausgeführt wird. Der Befehl gibt ein Auftragsobjekt für jeden Computer zurück. Das Auftragsobjekt besteht aus einem übergeordneten Auftrag einer Führungskraft und einem untergeordneten Auftrag, der den Befehl ausführt.
Der übergeordnete Auftrag stellt alle untergeordneten Aufträge dar. Wenn Sie einen übergeordneten Auftrag verwalten, verwalten Sie auch die zugeordneten untergeordneten Aufträge. Wenn Sie beispielsweise einen übergeordneten Auftrag beenden, werden alle untergeordneten Aufträge beendet. Wenn Sie die Ergebnisse eines übergeordneten Auftrags erhalten, erhalten Sie die Ergebnisse aller untergeordneten Aufträge.
Sie können untergeordnete Aufträge jedoch auch einzeln verwalten. Dies ist besonders nützlich, wenn Sie ein Problem mit einem Auftrag untersuchen oder die Ergebnisse nur eines von mehreren untergeordneten Aufträgen abrufen möchten, die mit dem AsJob-Parameter von Invoke-Command
gestartet wurden.
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 $j
Variablen.
PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob
Wenn Sie die Eigenschaften Name und ChildJob des Auftrags in $j
anzeigen, wird angezeigt, dass der Befehl ein Auftragsobjekt mit drei untergeordneten Aufträgen zurückgegeben hat, einen für jeden Computer.
PS> $j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
Wenn Sie den übergeordneten Auftrag anzeigen, wird angezeigt, dass der Auftrag fehlgeschlagen ist.
PS> $j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
Wenn Sie jedoch einen Get-Job
Befehl ausführen, der die untergeordneten Aufträge abruft, zeigt die Ausgabe, dass nur ein untergeordneter Auftrag fehlgeschlagen ist.
PS> 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 aber auch die Ergebnisse eines bestimmten untergeordneten Auftrags abrufen, wie im folgenden Befehl gezeigt.
PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
Das Feature untergeordnete Aufträge von PowerShell-Hintergrundaufträgen bietet Ihnen mehr Kontrolle über die ausgeführten Aufträge.
Auftragstypen
PowerShell unterstützt verschiedene Arten von Aufträgen für verschiedene Aufgaben. Ab Windows PowerShell 3.0 können Entwickler "Auftragsquelladapter" schreiben, die PowerShell neue Auftragstypen hinzufügen und die Quelladapter des Auftrags in Module einschließen. Wenn Sie das Modul importieren, können Sie den neuen Auftragstyp in Ihrer Sitzung verwenden.
Das Modul PSScheduledJob fügt beispielsweise geplante Aufträge hinzu, und das PSWorkflow-Modul fügt Workflowaufträge hinzu.
Benutzerdefinierte Auftragstypen können sich erheblich von Standardmäßigen PowerShell-Hintergrundaufträgen unterscheiden. 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, die Sie zum Verwalten von benutzerdefinierten Aufträgen verwenden, hängen vom Auftragstyp ab. Für einige verwenden Sie die Standardauftrags-Cmdlets, z Get-Job
. B. 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 Auftragstyp.
Verwenden Sie das Cmdlet, um den Get-Job
Auftragstyp eines Auftrags zu ermitteln. Get-Job
gibt unterschiedliche Auftragsobjekte für verschiedene Auftragstypen zurück. Der Wert der PSJobTypeName-Eigenschaft der zurückgegebenen Auftragsobjekte Get-Job
gibt den Auftragstyp an.
In der folgenden Tabelle sind die Auftragstypen aufgeführt, die im Lieferumfang von PowerShell enthalten sind.
Auftragstyp | BESCHREIBUNG |
---|---|
BackgroundJob | Die Verwendung des Cmdlets Start-Job wurde gestartet. |
RemoteJob | Verwendung des AsJob-Parameters des |
Invoke-Command cmdlet. |
|
PSWorkflowJob | Begann mit der Verwendung des AsJob-Parameters eines Workflows. |
PSScheduledJob | Eine instance eines geplanten Auftrags, der von einem Auftragstrigger gestartet wurde. |
CIMJob | Verwendung des AsJob-Parameters eines Cmdlets aus einem |
CDXML-Modul. | |
WMIJob | Verwendung des AsJob-Parameters eines Cmdlets aus einem |
WMI-Modul. | |
PSEventJob | Erstellt mitRegister-ObjectEvent und Angeben von |
action mit dem Action-Parameter . |
HINWEIS: Bevor Sie das Get-Job
Cmdlet zum Abrufen von Aufträgen eines bestimmten Typs verwenden, überprüfen Sie, ob das Modul, das den Auftragstyp hinzufügt, in die aktuelle Sitzung importiert wird.
Get-Job
Andernfalls werden keine Aufträge dieses Typs abgerufen.
Beispiele
Mit den folgenden Befehlen wird ein lokaler Hintergrundauftrag, ein Remotehintergrundauftrag, ein Workflowauftrag und ein geplanter Auftrag erstellt. Anschließend wird das Get-Job
Cmdlet verwendet, um die Aufträge abzurufen. Get-Job
ruft den geplanten Auftrag nicht ab, aber es werden alle gestarteten Instanzen des geplanten Auftrags abgerufen.
Starten Sie einen Hintergrundauftrag auf dem lokalen Computer.
PS> Start-Job -Name LocalData {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Running True localhost Get-Process
Starten Sie einen Hintergrundauftrag, der auf einem Remotecomputer ausgeführt wird.
PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
Geplanten Auftrag erstellen
PS> 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 einen Workflow.
PS> workflow Test-Workflow {Get-Process}
Führen Sie den Workflow als Auftrag aus.
PS> Test-Workflow -AsJob -JobName TestWFJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 TestWFJob PSWorkflowJob NotStarted True localhost Get-Process
Rufen Sie die Aufträge ab. Der Get-Job
Befehl ruft keine geplanten Aufträge ab, aber er ruft Instanzen des geplanten Auftrags ab, die gestartet werden.
PS> 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
Verwenden Sie das Get-ScheduledJob
Cmdlet, um geplante Aufträge abzurufen.
PS> Get-ScheduledJob
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True