about_Command_Precedence
Kurze Beschreibung
Beschreibt, wie PowerShell bestimmt, welcher Befehl ausgeführt werden soll.
Lange Beschreibung
Die Befehlsrangfolge beschreibt, wie PowerShell bestimmt, welcher Befehl ausgeführt werden soll, wenn eine Sitzung mehrere Befehle mit demselben Namen enthält. Befehle innerhalb einer Sitzung können ausgeblendet oder durch Befehle mit demselben Namen ersetzt werden. In diesem Artikel wird erläutert, wie ausgeblendete Befehle ausgeführt werden und wie Sie Konflikte mit Befehlsnamen vermeiden.
Rangfolge des Befehls
Wenn eine PowerShell-Sitzung mehrere Befehle mit demselben Namen enthält, bestimmt PowerShell, welcher Befehl mit den folgenden Regeln ausgeführt werden soll.
Wenn Sie den Pfad zu einem Befehl angeben, führt PowerShell den Befehl an dem durch den Pfad angegebenen Speicherort aus.
Der folgende Befehl führt z. B. das Skript FindDocs.ps1 im C:\TechDocs
Verzeichnis aus:
C:\TechDocs\FindDocs.ps1
Sie können jeden beliebigen ausführbaren Befehl mit seinem vollständigen Pfad ausführen. Als Sicherheitsfeature führt PowerShell keine ausführbaren Befehle aus, einschließlich PowerShell-Skripts und systemeigenen Befehlen, es sei denn, der Befehl befindet sich in einem Pfad, der in der Umgebungsvariable $env:Path
aufgeführt ist.
Wenn Sie eine ausführbare Datei ausführen möchten, die sich im aktuellen Verzeichnis befindet, geben Sie den vollständigen Pfad an, oder verwenden Sie den relativen Pfad .\
, um das aktuelle Verzeichnis darzustellen.
Geben Sie beispielsweise Folgendes ein, um die FindDocs.ps1
Datei im aktuellen Verzeichnis auszuführen:
.\FindDocs.ps1
Wenn Sie keinen Pfad angeben, verwendet PowerShell beim Ausführen von Befehlen die folgende Rangfolge.
- Alias
- Funktion
- Cmdlet (siehe Auflösung des Cmdlet-Namens)
- Externe ausführbare Dateien (einschließlich PowerShell-Skriptdateien)
Wenn Sie also eingeben help
, sucht PowerShell zuerst nach einem Alias namens help
, dann nach einer Funktion mit dem Namen Help
und schließlich nach einem Cmdlet mit dem Namen Help
. Es wird das erste help
gefundene Element ausgeführt.
Wenn Ihre Sitzung z. B. ein Cmdlet und eine Funktion enthält, die beide benannt ist Get-Map
, führt Get-Map
PowerShell die Funktion aus.
Hinweis
Dies gilt nur für geladene Befehle. Wenn eine build
ausführbare Datei und ein Alias build
für eine Funktion mit dem Namen eines Invoke-Build
Moduls vorhanden ist, das nicht in die aktuelle Sitzung geladen wird, führt PowerShell stattdessen die build
ausführbare Datei aus. Module werden nicht automatisch geladen, wenn sie die externe ausführbare Datei findet. Nur wenn keine externe ausführbare Datei gefunden wird, wird ein Alias, eine Funktion oder ein Cmdlet mit dem angegebenen Namen aufgerufen.
Auflösen von Elementen mit denselben Namen
Aufgrund dieser Regeln können Elemente durch Elemente mit demselben Namen ersetzt oder ausgeblendet werden.
Elemente werden ausgeblendet oder schattiert , wenn Sie weiterhin auf das ursprüngliche Element zugreifen können, z. B. indem Sie den Elementnamen mit einem Modulnamen qualifizieren.
Wenn Sie beispielsweise eine Funktion importieren, die denselben Namen wie ein Cmdlet in der Sitzung hat, ist das Cmdlet ausgeblendet, aber nicht ersetzt. Sie können das Cmdlet ausführen, indem Sie den zugehörigen modulqualifizierten Namen angeben.
Wenn Elemente ersetzt oder überschrieben werden, können Sie nicht mehr auf das ursprüngliche Element zugreifen.
Wenn Sie beispielsweise eine Variable importieren, die denselben Namen wie eine Variable in der Sitzung hat, wird die ursprüngliche Variable ersetzt. Sie können keine Variable mit einem Modulnamen qualifizieren.
Wenn Sie eine Funktion an der Befehlszeile erstellen und dann eine Funktion mit demselben Namen importieren, wird die ursprüngliche Funktion ersetzt.
Suchen nach ausgeblendeten Befehlen
Der Parameter "All " des Cmdlets "Get-Command " ruft alle Befehle mit dem angegebenen Namen ab, auch wenn sie ausgeblendet oder ersetzt werden. Ab PowerShell 3.0 ruft standardmäßig nur die Befehle ab, die ausgeführt werden, Get-Command
wenn Sie den Befehlsnamen eingeben.
In den folgenden Beispielen enthält die Sitzung eine Get-Date
Funktion und ein Get-Date-Cmdlet . Sie können verwenden Get-Command
, um zu bestimmen, welcher Befehl zuerst ausgewählt wird.
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Verwendet den Parameter "Alle ", um die verfügbaren Get-Date
Befehle auflisten zu können.
Get-Command Get-Date -All
CommandType Name Version Source
----------- ---- ------- ------
Function Get-Date
Cmdlet Get-Date 7.0.0.0 Microsoft.PowerShell.Utility
Get-Command where -All
CommandType Name Version Source
----------- ---- ------- ------
Alias where -> Where-Object
Application where.exe 10.0.22621.1 C:\Windows\system32\where.exe
Sie können bestimmte Befehle ausführen, indem Sie qualifizierende Informationen einschließen, die den Befehl von anderen Befehlen unterscheiden, die möglicherweise denselben Namen haben.
Für Cmdlets können Sie den modulqualifizierten Namen verwenden. Bei ausführbaren Dateien können Sie die Dateierweiterung einschließen. Um beispielsweise die ausführbare Version der where
Verwendung where.exe
auszuführen.
Verwenden von modulqualifizierten Namen
Mithilfe des modulqualifizierten Namens eines Cmdlets können Sie Befehle ausführen, die durch ein Element mit demselben Namen ausgeblendet sind. Sie können das Get-Date
Cmdlet beispielsweise ausführen, indem Sie es mit dem Modulnamen "Microsoft.PowerShell.Utility " oder seinem Pfad qualifizieren. Wenn Sie modulqualifizierte Namen verwenden, kann das Modul automatisch in die Sitzung importiert werden, abhängig vom Wert von $PSModuleAutoLoadingPreference
.
Hinweis
Sie können modulnamen nicht verwenden, um Variablen oder Aliase zu qualifizieren.
Durch die Verwendung von modulqualifizierten Namen wird sichergestellt, dass Sie den Befehl ausführen, den Sie ausführen möchten. Dies ist die empfohlene Methode zum Aufrufen von Cmdlets beim Schreiben von Skripts, die Sie verteilen möchten.
Im folgenden Beispiel wird veranschaulicht, wie sie einen Befehl qualifizieren, indem er den Modulnamen einbezieht.
Wichtig
Die Modulqualifizierung verwendet das umgekehrte Schrägstrichzeichen (\
), um den Modulnamen unabhängig von der Plattform vom Befehlsnamen zu trennen.
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM
Verwenden Sie den zugehörigen modulqualifizierten Namen, um einen New-Map
Befehl aus dem MapFunctions
Modul auszuführen:
MapFunctions\New-Map
Um das Modul zu finden, aus dem ein Befehl importiert wurde, verwenden Sie die ModuleName-Eigenschaft von Befehlen.
(Get-Command <command-name>).ModuleName
Um beispielsweise die Quelle des Get-Date
Cmdlets zu finden, geben Sie Folgendes ein:
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
Wenn Sie den Namen des Befehls mithilfe des Pfads zum Modul qualifizieren möchten, müssen Sie den Schrägstrich () als Pfadtrennzeichen und das umgekehrte Schrägstrichzeichen/
(\
) vor dem Befehlsnamen verwenden. Verwenden Sie das folgende Beispiel, um das Get-Date
Cmdlet auszuführen:
//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Der Pfad kann ein vollständiger Pfad oder ein Pfad sein, der relativ zum aktuellen Speicherort ist.
Unter Windows können Sie keinen laufwerkqualifizierten Pfad verwenden. Sie müssen einen UNC-Pfad verwenden, wie im vorherigen Beispiel gezeigt, oder einen Pfad, der relativ zum aktuellen Laufwerk ist.
Im folgenden Beispiel wird davon ausgegangen, dass sich ihr aktueller Speicherort auf dem C:
Laufwerk befindet.
/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Verwenden des Anrufanbieters
Sie können auch den Aufrufoperator (&
) verwenden, um ausgeblendete Befehle auszuführen, indem Sie sie mit einem Aufruf von Get-ChildItem (dem Alias ist dir
) Get-Command
oder Get-Module kombinieren.
Der Aufrufoperator führt Zeichenfolgen und Skriptblöcke in einem untergeordneten Bereich aus. Weitere Informationen finden Sie unter about_Operators.
Verwenden Sie beispielsweise den folgenden Befehl, um die Funktion mit dem Namen Map
auszuführen, die durch einen Alias mit dem Namen Map
ausgeblendet ist.
& (Get-Command -Name Map -CommandType Function)
or
& (dir Function:\map)
Sie können den ausgeblendeten Befehl auch in einer Variablen speichern, um die Ausführung zu vereinfachen.
Beispielsweise speichert der folgende Befehl die Funktion in der Map
$myMap
Variablen und verwendet dann den Call
Operator, um sie auszuführen.
$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)
Ersetzte Elemente
Ein ersetztes Element ist ein Element, auf das Sie nicht mehr zugreifen können. Sie können Elemente ersetzen, indem Sie Elemente mit demselben Namen aus einem Modul importieren.
Wenn Sie beispielsweise eine Get-Map
Funktion in Ihrer Sitzung eingeben und eine Funktion importieren, die aufgerufen wird Get-Map
, ersetzt sie die ursprüngliche Funktion. Sie können sie in der aktuellen Sitzung nicht abrufen.
Variablen und Aliase können nicht ausgeblendet werden, da Sie keinen Anrufoperator oder einen qualifizierten Namen verwenden können, um sie auszuführen. Wenn Sie Variablen und Aliase aus einem Modul importieren, ersetzen sie Variablen in der Sitzung durch denselben Namen.
Auflösung des Cmdlet-Namens
Wenn Sie den qualifizierten Namen eines Cmdlets nicht verwenden, überprüft PowerShell, ob das Cmdlet in der aktuellen Sitzung geladen wird. Wenn mehrere Module geladen sind, die denselben Cmdlet-Namen enthalten, verwendet PowerShell das Cmdlet aus dem ersten Modul alphabetisch gefunden.
Wenn das Cmdlet nicht geladen wird, durchsucht PowerShell die installierten Module und überlädt das erste Modul, das das Cmdlet enthält, und führt dieses Cmdlet aus.
PowerShell sucht nach Modulen in jedem Pfad, der in der Umgebungsvariable $env:PSModulePath
definiert ist. Die Pfade werden in der Reihenfolge durchsucht, in der sie in der Variablen aufgeführt sind. Innerhalb jedes Pfads werden die Module in alphabetischer Reihenfolge durchsucht. PowerShell verwendet das Cmdlet aus der ersten Gefundenen Übereinstimmung.
Vermeiden von Namenskonflikten
Die beste Möglichkeit zum Verwalten von Befehlsnamenkonflikten besteht darin, sie zu verhindern. Wenn Sie Ihre Befehle benennen, verwenden Sie einen eindeutigen Namen. Fügen Sie z. B. die Initialen oder das Firmennamen-Akronym zu den Substantiven in Ihren Befehlen hinzu.
Wenn Sie Befehle aus einem PowerShell-Modul oder aus einer anderen Sitzung in Ihre Sitzung importieren, können Sie den Prefix
Parameter des Cmdlets "Import-Module " oder "Import-PSSession " verwenden, um den Substantiven in den Namen von Befehlen ein Präfix hinzuzufügen.
Mit dem folgenden Befehl wird beispielsweise ein Konflikt mit den Get-Date
PowerShell-Cmdlets Set-Date
vermieden, wenn Sie das DateFunctions
Modul importieren.
Import-Module -Name DateFunctions -Prefix ZZ
Ausführen externer ausführbarer Dateien
Unter Windows. PowerShell behandelt die in der $env:PATHEXT
Umgebungsvariablen aufgeführten Dateierweiterungen als ausführbare Dateien. Dateien, die keine Windows-ausführbaren Dateien sind, werden an Windows übergeben, um sie zu verarbeiten. Windows sucht die Dateizuordnung und führt das Standardmäßige Windows Shell-Verb für die Erweiterung aus. Damit Windows die Ausführung per Dateierweiterung unterstützt, muss die Zuordnung beim System registriert werden.
Sie können das ausführbare Modul für eine Dateierweiterung mit den ftype
Befehlen assoc
und Befehlen der CMD-Befehlsshell registrieren. PowerShell verfügt nicht über eine direkte Methode zum Registrieren des Dateihandlers. Weitere Informationen finden Sie in der Dokumentation für den Befehl "ftype ".
Damit PowerShell eine Dateierweiterung in der aktuellen Sitzung als ausführbare Datei anzeigen kann, müssen Sie die Erweiterung zur $env:PATHEXT
Umgebungsvariable hinzufügen.