Freigeben über


Ausführen von Befehlen in der Shell

PowerShell ist eine Befehlszeilenshell und eine Skriptsprache, die für die Automatisierung verwendet wird. Ähnlich wie bei anderen Shells wie bash unter Linux oder der Windows-Befehlsshell (cmd.exe) können Sie mit PowerShell alle befehle ausführen, die auf Ihrem System verfügbar sind, nicht nur PowerShell-Befehle.

Typen von Befehlen

Für jede Shell in jedem Betriebssystem gibt es drei Arten von Befehlen:

  • Shell-Schlüsselwörter sind Teil der Skriptsprache der Shell.

    • Beispiele für bash Schlüsselwörter sind: if, then, else, elifund fi.
    • Beispiele für cmd.exe Schlüsselwörter sind: dir, copy, move, ifund echo.
    • Beispiele für PowerShell-Schlüsselwörter sind: for, foreach, try, catchund trap.

    Shell-Sprachstichwörter können nur in der Laufzeitumgebung der Shell verwendet werden. Es gibt keine ausführbare Datei außerhalb der Shell, die die Funktionalität des Schlüsselworts bereitstellt.

  • betriebssystemeigene Befehle sind ausführbare Dateien, die im Betriebssystem installiert sind. Die ausführbaren Dateien können über jede Befehlszeilenshell wie PowerShell ausgeführt werden. Dazu gehören Skriptdateien, die möglicherweise andere Shells benötigen, um ordnungsgemäß zu funktionieren. Wenn Sie beispielsweise ein Windows-Batchskript (.cmd Datei) in PowerShell ausführen, führt PowerShell cmd.exe aus und übergibt die Batchdatei zur Ausführung.

  • umgebungsspezifische Shellbefehle sind Befehle in externen Dateien definiert, die nur innerhalb der Laufzeitumgebung der Shell verwendet werden können. Dazu gehören Skripts und Funktionen, oder sie können speziell kompilierte Module sein, die der Shell-Laufzeit Befehle hinzufügen. In PowerShell werden diese Befehle als Cmdlets (ausgesprochen "Command-lets") bezeichnet.

Ausführen systemeigener Befehle

Jeder systemeigene Befehl kann über die PowerShell-Befehlszeile ausgeführt werden. In der Regel führen Sie den Befehl genau wie in bash oder cmd.exeaus. Das folgende Beispiel zeigt das Ausführen des befehls grep in bash unter Ubuntu Linux.

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Nach dem Starten von PowerShell unter Ubuntu können Sie denselben Befehl über die PowerShell-Befehlszeile ausführen:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

Übergeben von Argumenten an native Befehle

Die meisten Shells umfassen Features für die Verwendung von Variablen, die Auswertung von Ausdrücken und das Behandeln von Zeichenfolgen. Allerdings werden diese Aufgaben von jeder Shell anders ausgeführt. In PowerShell beginnen alle Parameter mit einem Bindestrich (-) Zeichen. In cmd.exeverwenden die meisten Parameter ein Schrägstrich (/) Zeichen. Andere Befehlszeilentools verfügen möglicherweise nicht über ein Sonderzeichen für Parameter.

Jede Shell verfügt über eine eigene Methode zum Behandeln und Auswerten von Zeichenfolgen in der Befehlszeile. Wenn Sie systemeigene Befehle in PowerShell ausführen, die erwarten, dass Zeichenfolgen auf eine bestimmte Weise zitiert werden, müssen Sie möglicherweise anpassen, wie Sie diese Zeichenfolgen übergeben.

Weitere Informationen finden Sie in den folgenden Artikeln:

PowerShell 7.2 führte ein neues experimentelles Feature PSNativeCommandArgumentPassing ein, das die systemeigene Befehlsbehandlung verbessert hat. Weitere Informationen finden Sie unter $PSNativeCommandArgumentPassing.

Behandeln von Ausgaben und Fehlern

PowerShell verfügt auch über mehrere mehr Ausgabedatenströme als andere Shells. Die Shells bash und cmd.exe verfügen über stdout und stderr. PowerShell verfügt über sechs Ausgabestreams. Weitere Informationen finden Sie unter about_Redirection und about_Output_Streams.

Im Allgemeinen wird die von einem nativen Befehl an stdout gesendete Ausgabe an den Erfolg-Stream in PowerShell gesendet. Von einem nativen Befehl an stderr gesendete Ausgaben werden an den Fehler-Stream in PowerShell gesendet.

Wenn ein nativer Befehl einen Exitcode ungleich 0 (null) aufweist, wird $? auf $false festgelegt. Wenn der Ausgangscode null ist, wird $? auf $truefestgelegt.

Dies hat sich jedoch in PowerShell 7.2 geändert. Fehlereinträge, die von systemeigenen Befehlen umgeleitet werden, z. B. bei Verwendung von Umleitungsoperatoren (2>&1), werden nicht in die $Error Variable von PowerShell geschrieben, und die Einstellungsvariable $ErrorActionPreference wirkt sich nicht auf die umgeleitete Ausgabe aus.

Viele native Befehle schreiben in stderr als alternativen Stream für weitere Informationen. Dieses Verhalten kann beim Durchsehen von Fehlern in PowerShell Verwirrung verursachen, und die zusätzlichen Ausgabeinformationen können verloren gehen, wenn $ErrorActionPreference auf einen Zustand festgelegt ist, der die Ausgabe unterdrückt.

PowerShell 7.3 hat ein neues experimentelles Feature PSNativeCommandErrorActionPreference hinzugefügt, mit dem Sie steuern können, ob die Ausgabe an stderr als Fehler behandelt wird. Weitere Informationen finden Sie unter $PSNativeCommandUseErrorActionPreference.

Ausführen von PowerShell-Befehlen

Wie bereits erwähnt, werden PowerShell-Befehle als Cmdlets bezeichnet. Cmdlets werden in PowerShell-Modulen gesammelt, die bei Bedarf geladen werden können. Cmdlets können in jeder kompilierten .NET-Sprache oder mithilfe der PowerShell-Skriptsprache selbst geschrieben werden.

PowerShell-Befehle, die andere Befehle ausführen

Mit dem PowerShell--Aufrufoperator (&) können Sie Befehle ausführen, die in Variablen gespeichert sind und durch Zeichenfolgen oder Skriptblöcke dargestellt werden. Sie können dies verwenden, um einen beliebigen systemeigenen Befehl oder PowerShell-Befehl auszuführen. Dies ist in einem Skript hilfreich, wenn Sie die Befehlszeilenparameter für einen systemeigenen Befehl dynamisch erstellen müssen. Weitere Informationen finden Sie unter dem Aufrufoperator.

Das cmdlet Start-Process kann verwendet werden, um systemeigene Befehle auszuführen, sollte jedoch nur verwendet werden, wenn Sie steuern müssen, wie der Befehl ausgeführt wird. Das Cmdlet verfügt über Parameter zur Unterstützung der folgenden Szenarien:

  • Ausführen eines Befehls mit unterschiedlichen Anmeldeinformationen
  • Ausblenden des konsolenfensters, das vom neuen Prozess erstellt wurde
  • Umleiten der Streams stdin, stdout und stderr
  • Verwenden eines anderen Arbeitsverzeichnisses für den Befehl

Im folgenden Beispiel wird der systemeigene Befehl sort.exe mit umgeleiteten Eingabe- und Ausgabedatenströmen ausgeführt.

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

Weitere Informationen finden Sie unter Start-Process.

Unter Windows führt das Cmdlet Invoke-Item die Standardaktion für das angegebene Element aus. Sie führt beispielsweise eine ausführbare Datei aus oder öffnet eine Dokumentdatei mithilfe der Anwendung, die dem Dokumentdateityp zugeordnet ist. Die Standardaktion hängt vom Typ des Elements ab und wird vom PowerShell-Anbieter aufgelöst, der Zugriff auf das Element ermöglicht.

Im folgenden Beispiel wird das PowerShell-Quellcode-Repository in Ihrem Standardwebbrowser geöffnet.

Invoke-Item https://github.com/PowerShell/PowerShell

Weitere Informationen finden Sie unter Invoke-Item.