Warten auf die Beendigung jedes Befehls in PowerShell
-
Verwenden der
Out
-Befehle zum Warten auf das Beenden jedes Befehls in PowerShell -
Verwenden des Cmdlet
Start-Process
zum Warten auf das Beenden jedes Befehls in PowerShell - Verwenden von Hintergrundjobs zum Warten auf die Beendigung jedes Befehls in PowerShell
-
Verwenden des Cmdlet
Wait-Process
zum Warten auf die Beendigung jedes Befehls in PowerShell -
Verwenden der Klasse
[Diagnostics.Process]
zum 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
-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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn