Share via


about_Command_Precedence

Kurze Beschreibung

Beschreibt, wie PowerShell bestimmt, welcher Befehl ausgeführt werden soll.

Lange Beschreibung

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 anhand der folgenden Regeln, welcher Befehl 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 FindDocs.ps1 Skript im Verzeichnis "C:\TechDocs" aus:

C:\TechDocs\FindDocs.ps1

Als Sicherheitsfeature führt PowerShell keine ausführbaren (nativen) Befehle aus, einschließlich PowerShell-Skripts, es sei denn, der Befehl befindet sich in einem Pfad, der in der Umgebungsvariable $env:path Path aufgeführt ist, oder Sie geben den Pfad zur Skriptdatei an.

Um ein Skript auszuführen, das sich im aktuellen Verzeichnis befindet, geben Sie den vollständigen Pfad an, oder geben Sie einen Punkt .\ ein, der das aktuelle Verzeichnis darstellt.

Um beispielsweise die FindDocs.ps1-Datei im aktuellen Verzeichnis auszuführen, geben Sie Folgendes ein:

.\FindDocs.ps1

Verwenden von Wildcards in der Ausführung

Sie können Bei der Befehlsausführung Wildcards verwenden. Die Verwendung von Platzhalterzeichen wird auch als Globbing bezeichnet.

PowerShell führt eine Datei mit einer Platzhalter-Übereinstimmung vor einer Literal-Übereinstimmung aus.

Betrachten Sie beispielsweise ein Verzeichnis mit den folgenden Dateien:

Get-ChildItem C:\temp\test


    Directory: C:\temp\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        5/20/2019   2:29 PM             28 a.ps1
-a----        5/20/2019   2:29 PM             28 [a1].ps1

Beide Skriptdateien haben den gleichen Inhalt: $MyInvocation.MyCommand.Path. Dieser Befehl zeigt den Namen des aufgerufenen Skripts an.

Wenn Sie ausführen [a1].ps1, wird die Datei a.ps1 ausgeführt, obwohl die Datei [a1].ps1 eine Literal-Übereinstimmung ist.

C:\temp\test\[a1].ps1
C:\temp\test\a.ps1

Nun löschen wir die a.ps1 Datei und versuchen, sie erneut auszuführen.

Remove-Item C:\temp\test\a.ps1
C:\temp\test\[a1].ps1
C:\temp\test\[a1].ps1

Sie können aus der Ausgabe sehen, die dieses Mal ausgeführt wird, [a1].ps1 da die Literal-Übereinstimmung die einzige Dateibesprechung für dieses Wildcardmuster ist.

Weitere Informationen zur Verwendung von Platzhaltern in PowerShell finden Sie unter about_Wildcards.

Hinweis

Um die Suche auf einen relativen Pfad zu beschränken, müssen Sie dem Skriptnamen den .\ Pfad voran stellen. Dadurch wird die Suche nach Befehlen auf Dateien in diesem relativen Pfad beschränkt. Ohne dieses Präfix kann eine andere PowerShell-Syntax in Konflikt stehen, und es gibt nur wenige Garantien, dass die Datei gefunden wird.

Wenn Sie keinen Pfad angeben, verwendet PowerShell die folgende Rangfolge, wenn Befehle für alle in der aktuellen Sitzung geladenen Elemente ausgeführt werden:

  1. Alias
  2. Funktion
  3. Cmdlet
  4. Externe ausführbare Dateien (Programme und Nicht-PowerShell-Skripts)

Wenn Sie also "help" eingeben, sucht PowerShell zunächst nach einem Alias namens help, dann nach einer Funktion mit dem Namen Helpund schließlich nach einem Cmdlet namens Help. Das erste help gefundene Element wird ausgeführt.

Wenn Ihre Sitzung beispielsweise ein Cmdlet und eine Funktion mit dem Namen Get-Mapenthält, führt PowerShell die Funktion aus, wenn Sie eingeben Get-Map.

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 in Invoke-Build einem Modul vorhanden sind, das nicht in die aktuelle Sitzung geladen wird, führt PowerShell stattdessen die build ausführbare Datei aus. Module werden in diesem Fall 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, wodurch das automatische Laden des Moduls ausgelöst wird.

Wenn die Sitzung Elemente desselben Typs enthält, die denselben Namen haben, führt PowerShell das neuere Element aus.

Wenn Sie z. B. ein anderes Get-Date Cmdlet aus einem Modul importieren, führt PowerShell beim Eingeben Get-Datedie importierte Version über das native Aus.

Ausgeblendete und ersetzte Elemente

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

Elemente werden "ausgeblendet" oder "verschattt", wenn Sie weiterhin auf das ursprüngliche Element zugreifen können, z. B. indem Sie den Elementnamen mit einem Modul- oder Snap-In-Namen qualifizieren.

Wenn Sie beispielsweise eine Funktion importieren, die denselben Namen wie ein Cmdlet in der Sitzung hat, wird das Cmdlet ausgeblendet (aber nicht ersetzt), da es aus einem Snap-In oder Modul importiert wurde.

Elemente werden "ersetzt" oder "überschrieben", wenn Sie nicht mehr auf das ursprüngliche Element zugreifen können.

Wenn Sie beispielsweise eine Variable importieren, die denselben Namen wie eine Variable in der Sitzung hat, wird die ursprüngliche Variable ersetzt und kann nicht mehr darauf zugegriffen werden. Sie können keine Variable mit einem Modulnamen qualifizieren.

Wenn Sie eine Funktion an der Befehlszeile eingeben und dann eine Funktion mit demselben Namen importieren, wird die ursprüngliche Funktion ersetzt und ist nicht mehr zugänglich.

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 .

Der folgende Befehl ruft den Befehl ab, der Get-Date ausgeführt wird, wenn Sie eingeben Get-Date.

Get-Command Get-Date
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date

Der folgende Befehl verwendet den Parameter All , um alle Get-Date Befehle abzurufen.

Get-Command Get-Date -All
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date
Cmdlet          Get-Date                  Microsoft.PowerShell.Utility

Ausführen ausgeblendeter Befehle

Sie können bestimmte Befehle ausführen, indem Sie Elementeigenschaften angeben, die den Befehl von anderen Befehlen unterscheiden, die möglicherweise denselben Namen haben. Sie können diese Methode verwenden, um einen beliebigen Befehl auszuführen, aber sie ist besonders nützlich für die Ausführung ausgeblendeter Befehle.

Verwenden von qualifizierten Namen

Mithilfe des modulqualifizierten Namens eines Cmdlets können Sie Befehle ausführen, die von einem Element mit demselben Namen ausgeblendet werden. Sie können das Get-Date Cmdlet beispielsweise ausführen, indem Sie es mit dem Modulnamen Microsoft.PowerShell.Utility qualifizieren.

Verwenden Sie diese bevorzugte Methode beim Schreiben von Skripts, die Sie verteilen möchten. Sie können nicht vorhersagen, welche Befehle in der Sitzung vorhanden sein könnten, in der das Skript ausgeführt wird.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, September 4, 2018 8:17:25 AM

Um einen New-Map Befehl auszuführen, der vom Modul hinzugefügt wurde, 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

Um beispielsweise die Quelle des Get-Date Cmdlets zu ermitteln, geben Sie Folgendes ein:

(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility

Hinweis

Variablen oder Aliase können nicht qualifiziert werden.

Verwenden des Aufrufoperators

Sie können den Call Operator & auch 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.

Wenn Sie beispielsweise über eine Funktion namens verfügen Map , die durch einen Alias namens Mapausgeblendet wird, verwenden Sie den folgenden Befehl, um die Funktion auszuführen.

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

Der folgende Befehl speichert z. B. 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 oder Snap-In importieren.

Wenn Sie z. B. 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 nicht mit einem Aufrufoperator oder einem qualifizierten Namen ausgeführt werden können. Wenn Sie Variablen und Aliase aus einem Modul oder Snap-In importieren, ersetzen sie Variablen in der Sitzung mit demselben Namen.

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 Firmennamens akronym den Nomen in Ihren Befehlen hinzu.

Wenn Sie Befehle aus einem PowerShell-Modul oder einer anderen Sitzung in Ihre Sitzung importieren, verwenden Sie außerdem den Prefix Parameter import-Module oder

Import-PSSession-Cmdlet zum Hinzufügen eines Präfixes zu den Nomen in den Namen von Befehlen.

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

PowerShell behandelt die in der $env:PATHEXT Umgebungsvariablen aufgeführten Dateierweiterungen als ausführbare Dateien. Ausführbare Windows-Dateien sind Dateien mit .COM, .CPLoder .EXE Dateierweiterungen. Ausführbare Windows-Dateien und alle anderen Dateien mit erweiterungen, die in $env:PATHEXT aufgeführt sind, werden in der aktuellen Konsolensitzung ausgeführt.

Dateien, bei denen es sich nicht um ausführbare Windows-Dateien handelt, werden zur Verarbeitung an Windows übergeben. Windows sucht die Dateizuordnung und führt das Standardmäßige Windows Shell-Verb 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 mit den ftype Befehlen 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 in der aktuellen Sitzung als ausführbare Datei anzeigt, müssen Sie die Erweiterung der Umgebungsvariablen $env:PATHEXT hinzufügen.

Weitere Informationen