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.

  1. Alias
  2. Funktion
  3. Cmdlet (siehe Auflösung des Cmdlet-Namens)
  4. 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 Helpund 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-MapPowerShell 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.exeauszufü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 Mapausgeblendet ist.

& (Get-Command -Name Map -CommandType Function)

oder

& (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.

Weitere Informationen