Warten auf die Beendigung jedes Befehls in PowerShell

  1. Verwenden der Out-Befehle zum Warten auf das Beenden jedes Befehls in PowerShell
  2. Verwenden des Cmdlet Start-Process zum Warten auf das Beenden jedes Befehls in PowerShell
  3. Verwenden von Hintergrundjobs zum Warten auf die Beendigung jedes Befehls in PowerShell
  4. Verwenden des Cmdlet Wait-Process zum Warten auf die Beendigung jedes Befehls in PowerShell
  5. Verwenden der Klasse [Diagnostics.Process] zum Warten auf die Beendigung jedes Befehls in PowerShell
Warten auf die Beendigung jedes Befehls in PowerShell

Normalerweise wartet Windows PowerShell auf interne Befehle, bevor der folgende Befehl gestartet wird.

Eine Ausnahme von dieser Regel ist die auf einem externen Windows-Subsystem basierende EXE-Datei. Darüber hinaus wartet Windows PowerShell beim Ausführen ausführbarer Programme nicht auf das Beenden der Befehle.

Dieser Artikel zeigt Ihnen, wie Sie die Windows PowerShell-Umgebung dazu zwingen können, auf die Beendigung der Befehle mit ausführbaren Dateien zu warten, bevor Sie mit dem folgenden Befehl fortfahren.

Verwenden der Out-Befehle zum Warten auf das Beenden jedes Befehls in PowerShell

Wie bereits erwähnt, wird beim Ausführen einer ausführbaren Datei nicht auf die Beendigung des Befehls gewartet, sondern direkt zum folgenden Befehl übergegangen. Möglicherweise müssen wir dies vermeiden, insbesondere wenn wir ein Skript erstellen, das Anwendungen nacheinander ausführen soll.

Ein raffinierter Trick besteht darin, einen der Out-Befehle wie Out-Null zu verwenden. Wenn Sie eine Anwendung ausführen, wird Windows PowerShell durch die Weiterleitung des Cmdlets Out-Null dazu verleitet, ein zugrunde liegendes Cmdlet über der laufenden Anwendung auszuführen.

Denken Sie daran, dass das Cmdlet Out-Null nichts in der Konsole anzeigt und es daher wie eine standardmäßig ausgeführte Anwendung erscheinen lässt. Der einzige Unterschied besteht darin, dass auf die Ausführung der gesamten Befehlszeile gewartet wird.

Beispielcode:

Notepad.exe | Out-Null

Andere Beispiele für Out-Befehle, die wir verwenden können, sind die folgenden:

  • Out-Default – Sendet die Ausgabe an die Standardformatumgebung und das Standardausgabe-Cmdlet.
  • Out-File - Sendet die Ausgabe in eine Datei.
  • Out-GridView - Sendet die Ausgabe an eine interaktive Tabelle in einem separaten Fenster.
  • Out-Host - Sendet die Ausgabe an die Kommandozeile.
  • Out-Printer - Sendet die Ausgabe an einen Drucker.
  • Out-String - Sendet Objekte als eine Reihe von Strings an den Host.

Verwenden des Cmdlet Start-Process zum Warten auf das Beenden jedes Befehls in PowerShell

Eine weitere Methode, um Windows PowerShell auf das Beenden der Befehlszeile warten zu lassen, ist das Cmdlet Start-Process.

Beispielsweise können wir den Parameter -Wait des Cmdlets Start-Process verwenden, und die Windows PowerShell wartet, bis der Prozess abgeschlossen ist, bevor die folgende Befehlszeile ausgeführt wird.

Start-Process notepad.exe -NoNewWindow -Wait
Hinweis
Der Parameter -NoNewWindow im obigen Beispiel startet den aktuellen Prozess, ohne ein neues Konsolenfenster zu öffnen.

Bei Verwendung von PowerShell-Community-Erweiterungsversionen wird zuerst ein neues Objekt erstellt. Sobald das Objekt erstellt ist, wird die Funktion WaitForExit() aufgerufen.

$proc = Start-Process notepad.exe -NoNewWindow -PassThru
$proc.WaitForExit()

Verwenden von Hintergrundjobs zum Warten auf die Beendigung jedes Befehls in PowerShell

Eine andere Methode, Windows PowerShell auf das Beenden der Befehlszeile warten zu lassen, ist die Verwendung eines Hintergrundjobs.

Ein Hintergrundjob ist ein Befehl oder eine Reihe von Befehlen, die in einem separaten Prozess auf dem lokalen Computer ausgeführt werden. Die Beispielsyntax eines Hintergrundjobs ist unten dargestellt.

$job = Start-Job { notepad.exe }
Wait-Job $job
Receive-Job $job

Der Aufruf des Cmdlets Wait-Job lässt den Prozess warten, bis der Receive-Job in der Kommandozeile aufgerufen wird.

Verwenden des Cmdlet Wait-Process zum Warten auf die Beendigung jedes Befehls in PowerShell

Eine weitere Methode, Windows PowerShell auf das Beenden der Befehlszeile warten zu lassen, ist das Cmdlet Wait-Process.

Wie in unserem ersten Beispiel können wir dies in unsere ausführbare Datei leiten und warten, bis die Befehlszeile beendet ist. Die Verwendung dieses Cmdlets funktioniert jedoch nur mit Windows PowerShell-Versionen 5.1 und darunter und nicht mit der neuesten PowerShell (Core) 7.

Notepad.exe | Wait-Process

Verwenden der Klasse [Diagnostics.Process] zum Warten auf die Beendigung jedes Befehls in PowerShell

Wenn Sie eine .NET-Bibliothek in Ihrem System installiert haben, können Sie die Klasse [Diagnostics.Process] verwenden, um zu warten, bis Ihre Prozesse beendet sind, bevor Sie zur folgenden Befehlszeile wechseln.

Wir empfehlen jedoch nicht, dies zu verwenden, da andere einfachere Cmdlets in Windows PowerShell verfügbar sind, die wir vollständig nutzen können. Verwenden Sie .NET-Bibliotheken nur, wenn keine PowerShell-Befehle verfügbar sind.

[Diagnostics.Process]::Start('notepad.exe').WaitForExit()
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn