Freigeben über


Wait-Job

Wartet, bis ein oder alle powerShell-Aufträge, die in der Sitzung ausgeführt werden, in einem Beendigungszustand liegen.

Syntax

Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Id] <Int32[]>
    [<CommonParameters>]
Wait-Job
    [-Job] <Job[]>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Name] <String[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-InstanceId] <Guid[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-State] <JobState>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Filter] <Hashtable>
    [<CommonParameters>]

Beschreibung

Das Wait-Job Cmdlet wartet, bis sich ein Auftrag in einem Beendigungszustand befindet, bevor die Ausführung fortgesetzt wird. Die Beendigungszustände sind:

  • Abgeschlossen
  • Fehler
  • Beendet
  • Ausgesetzt
  • Getrennt

Sie können warten, bis ein angegebener Auftrag oder alle Aufträge in einem Beendigungszustand liegen. Sie können auch eine maximale Wartezeit für den Auftrag mithilfe des Timeout-Parameters festlegen oder den Parameter Force verwenden, um auf einen Auftrag in den Suspended Oder-Zuständen Disconnected zu warten.

Wenn die Befehle im Auftrag abgeschlossen sind, Wait-Job wird ein Auftragsobjekt zurückgegeben und die Ausführung fortgesetzt.

Sie können das Cmdlet verwenden, um mit dem Wait-Job Start-Job Cmdlet oder dem AsJob-Parameter des Invoke-Command Cmdlets auf die gestarteten Aufträge zu warten. Weitere Informationen zu Aufträgen finden Sie unter Informationen zu Aufträgen.

Ab Windows PowerShell 3.0 wartet das Wait-Job Cmdlet auch auf benutzerdefinierte Auftragstypen, z. B. Workflowaufträge und Instanzen geplanter Aufträge. Um das Warten auf Aufträge eines bestimmten Typs zu ermöglichen Wait-Job , importieren Sie das Modul, das den benutzerdefinierten Auftragstyp unterstützt, in die Sitzung, bevor Sie das Get-Job Cmdlet ausführen, entweder mithilfe des Import-Module Cmdlets oder mithilfe oder Abrufen eines Cmdlets im Modul. Informationen zu einem bestimmten benutzerdefinierten Auftragstyp finden Sie in der Dokumentation der Funktion „Benutzerdefinierte Auftragstypen“.

Beispiele

Beispiel 1: Auf alle Aufträge warten

Get-Job | Wait-Job

Dieser Befehl wartet auf den Abschluss aller aufträge, die in der Sitzung ausgeführt werden.

Beispiel 2: Warten auf Aufträge, die auf Remotecomputern gestartet wurden, mithilfe des Startauftrags

$s = New-PSSession Server01, Server02, Server03
Invoke-Command -Session $s -ScriptBlock {Start-Job -Name Date1 -ScriptBlock {Get-Date}}
$done = Invoke-Command -Session $s -Command {Wait-Job -Name Date1}
$done.Count

3

In diesem Beispiel wird gezeigt, wie Sie das Cmdlet mit Aufträgen verwenden, die Wait-Job mit dem Start-Job Cmdlet auf Remotecomputern gestartet wurden. Beide Befehle Start-Job Wait-Job werden mithilfe des Invoke-Command Cmdlets an den Remotecomputer übermittelt.

In diesem Beispiel wird Wait-Job ermittelt, ob ein Get-Date Befehl, der als Auftrag auf drei verschiedenen Computern ausgeführt wird, abgeschlossen ist.

Der erste Befehl erstellt eine Windows PowerShell-Sitzung (PSSession) auf jedem der drei Remotecomputer und speichert sie in der $s Variablen.

Der zweite Befehl verwendet Invoke-Command die Ausführung Start-Job in jeder der drei Sitzungen in $s. Alle Aufträge heißen "Date1".

Der dritte Befehl wird zum Ausführen verwendet Invoke-Command Wait-Job. Dieser Befehl wartet auf den Abschluss der Date1 Aufträge auf jedem Computer. Die resultierende Auflistung (Array) von Auftragsobjekten wird in der $doneVariablen gespeichert.

Der vierte Befehl verwendet die Count-Eigenschaft des Arrays von Auftragsobjekten in der $done Variablen, um zu bestimmen, wie viele der Aufträge abgeschlossen sind.

Beispiel 3: Ermitteln, wann der erste Auftrag abgeschlossen ist

$s = New-PSSession -ComputerName (Get-Content -Path .\Machines.txt)
$c = 'Get-EventLog -LogName System | Where-Object {$PSItem.EntryType -eq "error" --and $PSItem.Source -eq "LSASRV"} | Out-File -FilePath Errors.txt'
Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {$Using:c}
Invoke-Command -Session $s -ScriptBlock {Wait-Job -Any}

In diesem Beispiel wird der Parameter Wait-Job "Any" verwendet, um zu bestimmen, wann sich die erste der in der aktuellen Sitzung ausgeführten Aufträge in einem Beendigungszustand befindet. Außerdem wird gezeigt, wie das Wait-Job Cmdlet verwendet wird, um auf den Abschluss von Remoteaufträgen zu warten.

Der erste Befehl erstellt eine PSSession auf jedem der Computer, die in der Machines.txt-Datei aufgeführt sind, und speichert die PSSession-Objekte in der $s Variablen. Der Befehl verwendet das Get-Content Cmdlet, um den Inhalt der Datei abzurufen. Der Get-Content Befehl ist in Klammern eingeschlossen, um sicherzustellen, dass er vor dem New-PSSession Befehl ausgeführt wird.

Der zweite Befehl speichert eine Get-EventLog Befehlszeichenfolge in Anführungszeichen in der $c Variablen.

Der dritte Befehl verwendet Invoke-Command cmdlet, um Start-Job in den einzelnen Sitzungen in $s. Der Start-Job Befehl startet einen Auftrag, der den Get-EventLog Befehl in der $c Variablen ausführt.

Der Befehl verwendet den Using-Bereichsmodifizierer , um anzugeben, dass die $c Variable auf dem lokalen Computer definiert wurde. Der Using-Bereichsmodifizierer wird in Windows PowerShell 3.0 eingeführt. Weitere Informationen zum Verwenden des Bereichsmodifizierers finden Sie unter about_Remote_Variables.

Der vierte Befehl verwendet Invoke-Command zum Ausführen eines Wait-Job Befehls in den Sitzungen. Er verwendet den Parameter Any , um zu warten, bis der erste Auftrag auf den Remotecomputern beendet wird.

Beispiel 4: Festlegen einer Wartezeit für Aufträge auf Remotecomputern

PS> $s = New-PSSession -ComputerName Server01, Server02, Server03
PS> $jobs = Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {Get-Date}}
PS> $done = Invoke-Command -Session $s -ScriptBlock {Wait-Job -Timeout 30}
PS>

In diesem Beispiel wird gezeigt, wie Sie den Timeout-Parameter Wait-Job verwenden, um eine maximale Wartezeit für die Aufträge festzulegen, die auf Remotecomputern ausgeführt werden.

Der erste Befehl erstellt eine PSSession auf jedem der drei Remotecomputer (Server01, Server02 und Server03) und speichert dann die PSSession-Objekte in der $s Variablen.

Der zweite Befehl wird Invoke-Command verwendet, um Start-Job in jedem der PSSession-Objekte in $s. Es speichert die resultierenden Auftragsobjekte in der $jobs Variablen.

Der dritte Befehl verwendet Invoke-Command die Ausführung Wait-Job in den einzelnen Sitzungen in $s. Der Wait-Job Befehl bestimmt, ob alle Befehle innerhalb von 30 Sekunden abgeschlossen wurden. Er verwendet den Timeout-Parameter mit dem Wert 30, um die maximale Wartezeit festzulegen, und speichert dann die Ergebnisse des Befehls in der $done Variablen.

In diesem Fall wurde nur der Befehl auf dem Computer Server02 nach 30 Sekunden abgeschlossen. Wait-Job beendet die Wartezeit, gibt das Objekt zurück, das den abgeschlossenen Auftrag darstellt, und zeigt die Eingabeaufforderung an.

Die $done Variable enthält ein Auftragsobjekt, das den Auftrag darstellt, der auf Server02 ausgeführt wurde.

Beispiel 5: Warten, bis einer von mehreren Aufträgen abgeschlossen ist

Wait-Job -id 1,2,5 -Any

Mit diesem Befehl werden drei Aufträge anhand ihrer IDs identifiziert und gewartet, bis sich eins dieser Aufträge in einem Beendigungszustand befindet. Die Ausführung wird fortgesetzt, wenn der erste Auftrag abgeschlossen ist.

Beispiel 6: Warten Sie auf einen Zeitraum, und lassen Sie dann zu, dass der Auftrag im Hintergrund fortgesetzt wird.

Wait-Job -Name "DailyLog" -Timeout 120

Dieser Befehl wartet 120 Sekunden (zwei Minuten), bis der DailyLog-Auftrag abgeschlossen ist. Wenn der Auftrag in den nächsten zwei Minuten nicht abgeschlossen wird, wird die Ausführung fortgesetzt, und der Auftrag wird weiterhin im Hintergrund ausgeführt.

Beispiel 7: Warten auf einen Auftrag anhand des Namens

Wait-Job -Name "Job3"

Dieser Befehl verwendet den Auftragsnamen, um den Auftrag zu identifizieren, für den gewartet werden soll.

Beispiel 8: Warten auf Aufträge auf dem lokalen Computer, die mit dem Startauftrag gestartet wurden

$j = Start-Job -ScriptBlock {Get-ChildItem -Filter *.ps1| Where-Object {$PSItem.LastWriteTime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
$j | Wait-Job

In diesem Beispiel wird gezeigt, wie Sie das Wait-Job Cmdlet mit Aufträgen verwenden, die auf dem lokalen Computer gestartet Start-Jobwurden.

Diese Befehle starten einen Auftrag, der die Windows PowerShell-Skriptdateien abruft, die in der letzten Woche hinzugefügt oder aktualisiert wurden.

Der erste Befehl verwendet Start-Job , um einen Auftrag auf dem lokalen Computer zu starten. Der Auftrag führt einen Get-ChildItem Befehl aus, der alle Dateien mit der Dateinamenerweiterung PS1 abruft, die in der letzten Woche hinzugefügt oder aktualisiert wurden.

Der dritte Befehl verwendet Wait-Job , um zu warten, bis sich der Auftrag in einem Beendigungszustand befindet. Nach Abschluss des Auftrags zeigt der Befehl das Auftragsobjekt an, das Informationen zum Auftrag enthält.

Beispiel 9: Warten auf Aufträge, die auf Remotecomputern mithilfe von Invoke-Command gestartet wurden

$s = New-PSSession -ComputerName Server01, Server02, Server03
$j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
$j | Wait-Job

In diesem Beispiel wird gezeigt, wie sie mit Aufträgen verwendet Wait-Job werden, die auf Remotecomputern mithilfe des AsJob-Parameters Invoke-Commandgestartet wurden. Bei Verwendung von AsJob wird der Auftrag auf dem lokalen Computer erstellt, und die Ergebnisse werden automatisch an den lokalen Computer zurückgegeben, obwohl der Auftrag auf den Remotecomputern ausgeführt wird.

In diesem Beispiel wird Wait-Job ermittelt, ob sich ein Get-Process Befehl, der in den Sitzungen auf drei Remotecomputern ausgeführt wird, in einem Beendigungszustand befindet.

Der erste Befehl erstellt PSSession-Objekte auf drei Computern und speichert sie in der $s Variablen.

Der zweite Befehl verwendet Invoke-Command die Ausführung Get-Process in jeder der drei Sitzungen in $s. Der Befehl verwendet den AsJob-Parameter , um den Befehl asynchron als Auftrag auszuführen. Der Befehl gibt ein Auftragsobjekt zurück, genau wie die mit der Verwendung Start-Jobgestarteten Aufträge, und das Auftragsobjekt wird in der $j Variablen gespeichert.

Der dritte Befehl verwendet einen Pipelineoperator (|), um das Auftragsobjekt an $j das Wait-Job Cmdlet zu senden. In Invoke-Command diesem Fall ist kein Befehl erforderlich, da sich der Auftrag auf dem lokalen Computer befindet.

Beispiel 10: Warten auf einen Auftrag mit einer ID

Get-Job

Id   Name     State      HasMoreData     Location             Command
--   ----     -----      -----------     --------             -------
1    Job1     Completed  True            localhost,Server01.. get-service
4    Job4     Completed  True            localhost            dir | where

Wait-Job -Id 1

Dieser Befehl wartet auf den Auftrag mit dem ID-Wert 1.

Parameter

-Any

Gibt an, dass dieses Cmdlet das Auftragsobjekt zurückgibt und die Ausführung fortsetzt, wenn ein Auftrag abgeschlossen ist. Wartet standardmäßig, bis alle angegebenen Aufträge abgeschlossen sind, Wait-Job bevor die Eingabeaufforderung angezeigt wird.

Typ:SwitchParameter
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-Filter

Gibt eine Hashtabelle mit Bedingungen an. Dieses Cmdlet wartet auf Aufträge, die alle Bedingungen in der Hashtabelle erfüllen. Geben Sie eine Hashtabelle ein, in der die Schlüssel Auftragseigenschaften und die Werte Werte der Auftragseigenschaften sind.

Dieser Parameter funktioniert nur mit benutzerdefinierten Auftragstypen, z. B. Workflowaufträgen und geplanten Aufträgen. Es funktioniert nicht bei Standardaufträgen, z. B. bei denen, die mit dem Start-Job Cmdlet erstellt wurden. Weitere Informationen zur Unterstützung für diesen Parameter finden Sie unter dem Hilfethema für den Auftragstyp.

Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.

Typ:Hashtable
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-Force

Gibt an, dass dieses Cmdlet weiterhin auf Aufträge im Zustand "Angehalten" oder "Getrennt" wartet. Gibt standardmäßig Wait-Job die Wartezeit zurück oder beendet sie, wenn Aufträge in einem der folgenden Zustände enthalten sind:

  • Abgeschlossen
  • Fehler
  • Beendet
  • Ausgesetzt
  • Getrennt

Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.

Typ:SwitchParameter
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-Id

Gibt ein Array von IDs von Aufträgen an, für die dieses Cmdlet wartet.

Die ID ist eine ganze Zahl, die den Auftrag in der aktuellen Sitzung eindeutig identifiziert. Es ist einfacher zu merken und einzugeben als die Instanz-ID, aber sie ist nur in der aktuellen Sitzung eindeutig. Sie können eine oder mehrere IDs eingeben, getrennt durch Kommas. Geben Sie die ID eines Auftrags ein.Get-Job

Typ:Int32[]
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-InstanceId

Gibt ein Array von Instanz-IDs von Aufträgen an, für die dieses Cmdlet wartet. Standardmäßig werden alle Aufträge fortgesetzt.

Eine Instanz-ID ist eine GUID, die den Auftrag auf dem Computer eindeutig identifiziert. Verwenden Sie die Instanz-ID eines Auftrags, um Get-Jobdie Instanz-ID eines Auftrags zu finden.

Typ:Guid[]
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-Job

Gibt die Aufträge an, für die dieses Cmdlet wartet. Geben Sie eine Variable ein, die Auftragsobjekte bzw. einen Befehl enthält, der die Auftragsobjekte abruft. Sie können auch einen Pipelineoperator verwenden, um Auftragsobjekte an das Wait-Job Cmdlet zu senden. Wartet standardmäßig auf alle Aufträge, Wait-Job die in der aktuellen Sitzung erstellt wurden.

Typ:Job[]
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-Name

Gibt Anzeigenamen von Aufträgen an, für die dieses Cmdlet wartet.

Typ:String[]
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-State

Gibt einen Auftragsstatus an. Dieses Cmdlet wartet nur auf Aufträge im angegebenen Zustand. Zulässige Werte für diesen Parameter:

  • NotStarted
  • Wird ausgeführt
  • Abgeschlossen
  • Fehler
  • Beendet
  • Blockiert
  • Ausgesetzt
  • Getrennt
  • Wird angehalten
  • Wird beendet

Weitere Informationen zu Auftragszuständen finden Sie unter JobState Enumeration.

Typ:JobState
Zulässige Werte:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-Timeout

Gibt die maximale Wartezeit für jeden Auftrag in Sekunden an. Der Standardwert -1 gibt an, dass das Cmdlet wartet, bis der Auftrag abgeschlossen ist. Die Anzeigedauer beginnt, wenn Sie den Wait-Job Befehl übermitteln, nicht den Start-Job Befehl.

Wenn diese Zeit überschritten wird, wird die Wartezeit beendet und die Ausführung fortgesetzt, auch wenn der Auftrag noch ausgeführt wird. Der Befehl zeigt keine Fehlermeldung an.

Typ:Int32
Aliase:TimeoutSec
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

Eingaben

System.Management.Automation.RemotingJob

Sie können ein Auftragsobjekt an dieses Cmdlet weiterleiten.

Ausgaben

System.Management.Automation.PSRemotingJob

Dieses Cmdlet gibt Auftragsobjekte zurück, die die Aufträge in einem Beendigungszustand darstellen. Wenn die Wartezeit endet, weil der Wert des Timeout-Parameters überschritten wird, Wait-Job werden keine Objekte zurückgegeben.

Hinweise

Windows PowerShell enthält die folgenden Aliase für Wait-Job:

  • wjb

Gibt standardmäßig Wait-Job die Wartezeit zurück oder beendet sie, wenn Aufträge in einem der folgenden Zustände enthalten sind:

  • Abgeschlossen
  • Fehler
  • Beendet
  • Ausgesetzt
  • Getrennt

Wait-Job Verwenden Sie den Parameter Force, um weiterhin auf angehaltene und getrennte Aufträge zu warten.