about_Command_Precedence

Letzte Aktualisierung: Mai 2014

Betrifft: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

Einführung hier einfügen.

THEMA

about_Command_Precedence

KURZE BESCHREIBUNG

Beschreibt, wie Windows PowerShell® ermittelt, welcher Befehl ausgeführt werden soll.

LANGE BESCHREIBUNG

In diesem Thema wird erläutert, wie Windows PowerShell ermittelt, welcher Befehl ausgeführt werden soll, insbesondere dann, wenn eine Sitzung mehr als einen Befehl mit demselben Namen enthält. Außerdem wird erläutert, wie Befehle ausgeführt werden können, die nicht standardmäßig ausgeführt werden, und es wird erläutert, wie Sie in Ihrer Sitzung Konflikte mit Befehlsnamen vermeiden können.

BEFEHLSRANGFOLGE

Wenn eine Sitzung Befehle enthält, die den gleichen Namen haben, verwendet Windows PowerShell die folgenden Regeln, um zu entscheiden, welcher Befehl auszuführen ist.

Diese Regeln sind vor allem dann sehr wichtig, wenn Sie Befehle aus Modulen, Snap-Ins und anderen Sitzungen zu Ihrer Sitzung hinzufügen.

– Wenn Sie den Pfad zu einem Befehl angeben, führt Windows PowerShell den Befehl an der Position aus, die durch den Pfad angegeben ist.

Der folgende Befehl führt beispielsweise das Skript „FindDocs.ps1“ im Verzeichnis „C:\TechDocs“ aus:

             C:\TechDocs\FindDocs.ps1

Als Sicherheitsmaßnahme führt Windows PowerShell keine ausführbaren (systemeigenen) Befehle aus, einschließlich Windows PowerShell-Skripts, es sei denn, der Befehl befindet sich in einem Pfad, der in der Path-Umgebungsvariablen ($env:path) aufgelistet ist, oder wenn Sie den Pfad zur Skriptdatei angeben.

Zum Ausführen eines Skripts, das sich im aktuellen Verzeichnis befindet, geben Sie den vollständigen Pfad an, oder geben Sie einen Punkt (.) ein, um das aktuelle Verzeichnis zu repräsentieren.

Geben Sie z. B. zum Ausführen der Datei „FindDocs.ps1“ im aktuellen Verzeichnis Folgendes ein:

             .\FindDocs.ps1

– Wenn Sie keinen Pfad angeben, verwendet Windows PowerShell die folgende Rangfolge bei der Ausführung von Befehlen:

              1. Alias
              2. Function
              3. Cmdlet 
              4. Native Windows commands

Wenn Sie „help“ eingeben, sucht daher Windows PowerShell zuerst nach einen Alias namens „help“, dann nach einer Funktion namens „help“ und schließlich nach einem Cmdlet namens „help“. Es wird das erste „help“-Element ausgeführt, das gefunden wird.

Beispiel: Sie verfügen über eine Get-Map-Funktion in der Sitzung und importieren ein Cmdlet namens „Get-Map“. Wenn Sie nun „Get-Map“ eingeben, führt Windows PowerShell standardmäßig die Get-Map-Funktion aus.

– Wenn die Sitzung Elemente desselben Typs mit gleichem Namen enthält, z. B. zwei Cmdlets mit dem gleichen Namen, führt Windows PowerShell das Element aus, das zuletzt zur Sitzung hinzugefügt wurde.

Wenn Sie z. B. über ein Get-Date-Cmdlet verfügen und ein weiteres Get-Date-Cmdlet importieren, führt Windows PowerShell standardmäßig das zuletzt importierte Cmdlet aus, wenn Sie „Get-Date“ eingeben.

AUSGEBLENDETE UND ERSETZTE ELEMENTE

Durch diese Regeln können Elemente durch Elemente mit dem gleichen Namen ersetzt oder ausgeblendet werden.

– Elemente werden „versteckt“ oder „schattiert“, wenn Sie weiterhin auf das ursprüngliche Element zugreifen können, z. B. durch Qualifizierung des Elementnamens mit einem Modul- oder Snap-In-Namen.

Wenn Sie z. B. eine Funktion importieren, die den gleichen 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 z. B. eine Variable importieren, die den gleichen Namen hat wie eine Variable in der Sitzung, wird die ursprüngliche Variable ersetzt, und der Zugriff darauf ist nicht mehr möglich. Sie können eine Variable nicht mit einem Modulnamen qualifizieren.

Auch wenn Sie eine Funktion in der Befehlszeile eingeben und dann eine Funktion mit dem gleichen Namen importieren, wird die ursprüngliche Variable ersetzt, und der Zugriff darauf ist nicht mehr möglich.

SUCHEN VON AUSGEBLENDETEN BEFEHLEN

Der All-Parameter des Get-Command-Cmdlets ruft alle Befehle mit dem angegebenen Namen ab, auch wenn sie ausgeblendet oder ersetzt sind. Ab Windows PowerShell 3.0 ruft Get-Command nur die Befehle ab, die ausgeführt werden, 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 Get-Date-Befehl auf, der ausgeführt wird, wenn Sie „Get-Date“ eingeben.

          PS C:\> Get-Command Get-Date

          CommandType     Name                                               ModuleName
          -----------     ----                                               ----------
          Function        get-date

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

          PS C:\> Get-Command Get-Date -All

          CommandType     Name                                               ModuleName
          -----------     ----                                               ----------
          Function        get-date
          Cmdlet          Get-Date                                           Microsoft.PowerShell.Utility

AUSFÜHREN VON AUSGEBLENDETEN BEFEHLEN

Sie können bestimmte Befehle ausführen, indem Sie Elementeigenschaften angeben, die den Befehl von anderen Befehlen unterscheiden, die den gleichen Namen haben.

Sie können diese Methode verwenden, um jeden Befehl ausführen, aber sie ist besonders nützlich zum Ausführen ausgeblendeter Befehle.

Diese Methode wird empfohlen, wenn Sie Skripts schreiben, die Sie verteilen wollen, da Sie nicht vorhersehen können, welche Befehle möglicherweise in der Sitzung vorhanden sind, in der das Skript ausgeführt wird.

QUALIFIZIERTE NAMEN

Sie können Befehle ausführen, die aus einem Windows PowerShell-Snap-In oder -Modul oder aus einer anderen Sitzung importiert wurden, indem Sie den Befehlsnamen mit dem Namen des Moduls oder -Snap-In qualifizieren, aus dem er stammt.

Sie können Befehle qualifizieren, aber es ist nicht möglich, Variablen oder Aliase zu qualifizieren.

Wenn z. B. das Get-Date-Cmdlet aus dem Microsoft.PowerShell.Utility-Snap-In durch ein Alias, eine Funktion oder ein Cmdlet mit dem gleichen Namen ausgeblendet ist, können Sie es ausführen, indem Sie den durch das Snap-In qualifizierten Namen des Cmdlets verwenden:

          Microsoft.PowerShell.Utility\Get-Date

Um einen New-Map-Befehl auszuführen, der durch das MapFunctions-Modul hinzugefügt wurde, verwenden Sie den durch das Modul qualifizierten Namen:

          MapFunctions\New-Map

Um das Snap-In oder 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 suchen, geben Sie ein:

          PS C:\>(Get-Command Get-Date).ModuleName
          Microsoft.PowerShell.Utility

CALL-OPERATOR

Sie können auch den Call-Operator (&) verwenden, um jeden Befehl auszuführen, den Sie abrufen können, in dem Sie einen Get-ChildItem- (Alias ist „dir“), Get-Command- oder Get-Module-Befehl verwenden.

Um einen Befehl auszuführen, schließen Sie den Get-Befehl in Klammern ein und verwenden den Call-Operator Call (&) zum Ausführen des Befehls.

          &(Get-Command ...)  

      - or -

          &(dir ... )

Wenn Sie z. B. über eine Funktion namens „Map“ verfügen, die durch einen Alias namens „Map“ ausgeblendet wurde, verwenden Sie den folgenden Befehl zum Ausführen der Funktion.

          &(Get-Command -Name Map -Type function)  

      - or -

          &(dir function:\map)

Sie können Ihren ausgeblendeten Befehl auch in einer Variablen speichern, damit er einfacher ausgeführt werden kann.

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 -Type function)

          &($myMap)

Wenn ein Befehl aus einem Modul stammt, können Sie das folgende Format, um ihn auszuführen.

         & <PSModuleInfo-object> <command>

Um z. B. das Add-File-Cmdlet im FileCommands-Modul auszuführen, verwenden Sie die folgende Befehlssequenz.

         $FileCommands = get-module -name FileCommands
           
         & $FileCommands Add-File

ERSETZTE ELEMENTE

Elemente, die nicht aus einem Modul oder Snap-In importiert wurden, z. B. Funktionen, Variablen und Aliase, die Sie in Ihrer Sitzung erstellen oder die Sie mithilfe eines Profils hinzufügen, können durch Befehle ersetzt werden, die den gleichen Namen haben. Wenn sie ersetzt wurden, können nicht darauf nicht mehr zugreifen.

Variablen und Aliase werden immer ersetzt, auch wenn sie aus einem Modul oder Snap-In importiert wurden, weil Sie nicht den Call-Operator oder einen qualifizierten Namen verwenden können, um sie auszuführen.

Wenn Sie z. B. in Ihrer Sitzung über eine Get-Map-Funktion verfügen und eine Funktion namens „Get-Map“ importieren, dann wird die ursprüngliche Funktion ersetzt. Sie können sie dann in der aktuellen Sitzung nicht mehr abrufen.

VERMEIDEN VON NAMENSKONFLIKTEN

Die beste Möglichkeit zum Umgang mit Konflikten bei Befehlsnamen ist deren Vermeidung. Wenn Sie Ihre Befehle benennen, sollten Sie einen Namen verwenden, der sehr spezifisch oder wahrscheinlich eindeutig ist. Fügen Sie z. B. Ihre Initialen oder den Namen Ihres Unternehmens zu den Substantiven in Ihren Befehlen hinzu.

Auch wenn Sie Befehle aus einem Windows PowerShell-Modul oder aus einer anderen Sitzung importieren, sollten Sie den Prefix-Parameter des Import-Moduls oder des Import-PSSession-Cmdlets verwenden, um einen Präfix zu den Substantiven in den Namen der Befehle hinzuzufügen.

Beispielsweise werden mit dem folgenden Befehl alle Konflikte mit den Set-Datum- und Get-Date-Cmdlets aus dem Lieferumfang von Windows PowerShell vermieden, wenn Sie das DateFunctions-Modul importieren.

          Import-Module -Name DateFunctions -Prefix ZZ

Weitere Informationen finden Sie unter „Import-Module“ und „Import-PSSession“.

SIEHE AUCH

about_Path_Syntax

about_Aliases

about_Functions

Alias (Anbieter)

Funktion (Anbieter)

Get-Command

Import-Module

Import-PSSession