Freigeben über


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 mehr als einen Befehl mit demselben Namen enthält. Befehle innerhalb einer Sitzung können ausgeblendet oder durch Befehle mit demselben Namen ersetzt werden. In diesem Artikel erfahren Sie, wie Sie ausgeblendete Befehle ausführen und Befehlsnamenkonflikte vermeiden.

Befehlsrangfolge

Wenn eine PowerShell-Sitzung mehrere Befehle mit demselben Namen enthält, bestimmt PowerShell den auszuführenden Befehl mithilfe der folgenden Regeln.

Wenn Sie den Pfad zu einem Befehl angeben, führt PowerShell den Befehl an der im Pfad angegebenen Position aus.

Mit dem folgenden Befehl wird beispielsweise das skript FindDocs.ps1 im C:\TechDocs Verzeichnis ausgeführt:

C:\TechDocs\FindDocs.ps1

Sie können jeden ausführbaren Befehl mit dem vollständigen Pfad ausführen. Als Sicherheitsfeature führt PowerShell keine ausführbaren Befehle aus, einschließlich PowerShell-Skripts und nativer Befehle, es sei denn, der Befehl befindet sich in einem Pfad, der in der $env:Path Umgebungsvariablen aufgeführt ist.

Um eine ausführbare Datei im aktuellen Verzeichnis auszuführen, 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 Cmdlet-Namensauflösung)
  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 führt das erste help Element aus, das es findet.

Wenn Ihre Sitzung beispielsweise ein Cmdlet und eine Funktion enthält, die beide den Namen haben 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 von Invoke-Build in einem Modul vorhanden sind, das nicht in die aktuelle Sitzung geladen wird, führt PowerShell stattdessen die build ausführbare Datei aus. Module werden nicht automatisch geladen, wenn die externe ausführbare Datei gefunden wird. 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

Als Ergebnis dieser Regeln können Elemente durch Elemente mit demselben Namen ersetzt oder ausgeblendet werden.

Elemente werden ausgeblendet oder verdeckt , 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, wird das Cmdlet ausgeblendet, aber nicht ersetzt. Sie können das Cmdlet ausführen, indem Sie seinen 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 eine Variable nicht 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 All-Parameter 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 All-Parameter , um verfügbare Get-Date Befehle aufzulisten.

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. Für ausführbare Dateien können Sie die Dateierweiterung einschließen. Zum Ausführen der ausführbaren Version von where verwenden Sie where.exebeispielsweise .

Verwenden von modulqualifizierten Namen

Mithilfe des modulqualifizierten Namens eines Cmdlets können Sie Befehle ausführen, die von einem Element mit demselben Namen ausgeblendet werden. Beispielsweise können Sie das Get-Date Cmdlet ausführen, indem Sie es mit dem Modulnamen Microsoft.PowerShell.Utility oder seinem Pfad qualifizieren. Wenn Sie modulqualifizierte Namen verwenden, kann das Modul abhängig vom Wert von $PSModuleAutoLoadingPreferenceautomatisch in die Sitzung importiert werden.

Hinweis

Sie können keine Modulnamen verwenden, um Variablen oder Aliase zu qualifizieren.

Die Verwendung von modulqualifizierten Namen stellt sicher, 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 Sie seinen Modulnamen einschließen.

Wichtig

Die Modulqualifikation verwendet den umgekehrten Schrägstrich (\), 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

Um einen New-Map Befehl aus dem Modul auszuführen, verwenden Sie dessen MapFunctions modulqualifizierten Namen:

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

Geben Sie beispielsweise Folgendes ein, um die Quelle des Get-Date Cmdlets zu finden:

(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 den umgekehrten Schrägstrich (\) 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 laufwerksqualifizierten 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 Anrufoperators

Sie können auch den Aufrufoperator (&) verwenden, um ausgeblendete Befehle auszuführen, indem Sie ihn mit einem Aufruf von Get-ChildItem (der 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 namens Mapausgeblendet wird.

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

oder

& (dir Function:\map)

Sie können ihren ausgeblendeten Befehl auch in einer Variablen speichern, um die Ausführung zu vereinfachen.

Beispielsweise speichert der folgende Befehl die Map Funktion in der $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 namens Get-Mapimportieren, 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 Aufrufoperator 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 mit demselben Namen.

Cmdlet-Namensauflösung

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 Cmdletnamen enthalten, verwendet PowerShell das Cmdlet aus dem ersten Modul, das alphabetisch gefunden wurde.

Wenn das Cmdlet nicht geladen wird, durchsucht PowerShell die installierten Module und ladet automatisch das erste Modul, das das Cmdlet enthält, und führt dieses Cmdlet aus. PowerShell sucht nach Modulen in jedem Pfad, der in der Umgebungsvariablen $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 Übereinstimmung, die es findet.

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 beispielsweise Die Initialen oder das Akronym des Unternehmensnamens zu den Nomen in Ihren Befehlen hinzu.

Wenn Sie Befehle aus einem PowerShell-Modul oder einer anderen Sitzung in Ihre Sitzung importieren, können Sie den Prefix Parameter des Cmdlets Import-Module oder Import-PSSession verwenden, um den Nomen in den Namen der Befehle ein Präfix hinzuzufügen.

Mit dem folgenden Befehl werden beispielsweise Konflikte mit den Cmdlets und Set-Date vermieden, die Get-Date in PowerShell enthalten sind, 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 ausführbaren Windows-Dateien sind, werden zur Verarbeitung an Windows übergeben. Windows sucht die Dateizuordnung und führt das Windows Shell-Standardverb für die Erweiterung aus. Damit Windows die Ausführung nach Dateierweiterung unterstützt, muss die Zuordnung beim System registriert sein.

Sie können die ausführbare Engine für eine Dateierweiterung mithilfe der ftype Befehle und assoc der CMD-Befehlsshell registrieren. PowerShell verfügt über keine direkte Methode zum Registrieren des Dateihandlers. Weitere Informationen finden Sie in der Dokumentation zum Befehl ftype .

Damit PowerShell eine Dateierweiterung als ausführbare Datei in der aktuellen Sitzung anzeigt, müssen Sie die Erweiterung der Umgebungsvariablen $env:PATHEXT hinzufügen.

Weitere Informationen