Delen via


about_Command_Precedence

Korte beschrijving

Beschrijft hoe PowerShell bepaalt welke opdracht moet worden uitgevoerd.

Lange beschrijving

Opdrachtprioriteit beschrijft hoe PowerShell bepaalt welke opdracht moet worden uitgevoerd wanneer een sessie meer dan één opdracht met dezelfde naam bevat. Opdrachten binnen een sessie kunnen worden verborgen of vervangen door opdrachten met dezelfde naam. In dit artikel leest u hoe u verborgen opdrachten uitvoert en hoe u conflicten tussen opdrachtnamen kunt voorkomen.

Prioriteit van opdracht

Wanneer een PowerShell-sessie meer dan één opdracht met dezelfde naam bevat, bepaalt PowerShell welke opdracht moet worden uitgevoerd met behulp van de volgende regels.

Als u het pad naar een opdracht opgeeft, voert PowerShell de opdracht uit op de locatie die door het pad is opgegeven.

Met de volgende opdracht wordt bijvoorbeeld het script FindDocs.ps1 uitgevoerd in de C:\TechDocs map:

C:\TechDocs\FindDocs.ps1

U kunt elke uitvoerbare opdracht uitvoeren met behulp van het volledige pad. Als beveiligingsfunctie voert PowerShell geen uitvoerbare opdrachten uit, waaronder PowerShell-scripts en systeemeigen opdrachten, tenzij de opdracht zich in een pad bevindt dat wordt vermeld in de $env:Path omgevingsvariabele.

Als u een uitvoerbaar bestand wilt uitvoeren dat zich in de huidige map bevindt, geeft u het volledige pad op of gebruikt u het relatieve pad .\ om de huidige map weer te geven.

Als u bijvoorbeeld het FindDocs.ps1 bestand wilt uitvoeren in de huidige map, typt u:

.\FindDocs.ps1

Als u geen pad opgeeft, gebruikt PowerShell de volgende prioriteitsvolgorde wanneer opdrachten worden uitgevoerd.

  1. Alias
  2. Functie
  3. Cmdlet (zie naamomzetting voor cmdlets)
  4. Externe uitvoerbare bestanden (inclusief PowerShell-scriptbestanden)

Als u typt help, zoekt PowerShell eerst naar een alias met de naam help, vervolgens naar een functie met de naam Helpen ten slotte naar een cmdlet met de naam Help. Hiermee wordt het eerste help item uitgevoerd dat wordt gevonden.

Als uw sessie bijvoorbeeld een cmdlet en een functie bevat, beide benoemd Get-Map, wanneer u typt Get-Map, wordt de functie uitgevoerd in PowerShell.

Notitie

Dit geldt alleen voor geladen opdrachten. Als er een build uitvoerbaar bestand is en een alias build voor een functie met de naam van Invoke-Build binnen een module die niet in de huidige sessie is geladen, wordt in PowerShell het build uitvoerbare bestand uitgevoerd. Modules worden niet automatisch geladen als het externe uitvoerbare bestand wordt gevonden. Het is alleen wanneer er geen extern uitvoerbaar bestand wordt gevonden dat een alias, functie of cmdlet met de opgegeven naam wordt aangeroepen.

Items met dezelfde namen oplossen

Als gevolg van deze regels kunnen items worden vervangen of verborgen door items met dezelfde naam.

Items zijn verborgen of schaduwen als u nog steeds toegang hebt tot het oorspronkelijke item, bijvoorbeeld door de itemnaam te kwalificeren met een modulenaam.

Als u bijvoorbeeld een functie importeert met dezelfde naam als een cmdlet in de sessie, is de cmdlet verborgen, maar niet vervangen. U kunt de cmdlet uitvoeren door de module-gekwalificeerde naam op te geven.

Wanneer items worden vervangen of overschreven, hebt u geen toegang meer tot het oorspronkelijke item.

Als u bijvoorbeeld een variabele importeert met dezelfde naam als een variabele in de sessie, wordt de oorspronkelijke variabele vervangen. U kunt een variabele niet kwalificeren met een modulenaam.

Als u een functie maakt op de opdrachtregel en vervolgens een functie met dezelfde naam importeert, wordt de oorspronkelijke functie vervangen.

Verborgen opdrachten zoeken

Met de parameter All van de cmdlet Get-Command worden alle opdrachten opgehaald met de opgegeven naam, zelfs als ze verborgen of vervangen zijn. Vanaf PowerShell 3.0 worden standaard Get-Command alleen de opdrachten weergegeven die worden uitgevoerd wanneer u de opdrachtnaam typt.

In de volgende voorbeelden bevat de sessie een Get-Date functie en een Get-Date-cmdlet . U kunt gebruiken Get-Command om te bepalen welke opdracht eerst wordt gekozen.

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

Hiermee gebruikt u de parameter Alle om beschikbare Get-Date opdrachten weer te geven.

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

U kunt bepaalde opdrachten uitvoeren door in aanmerking komende informatie op te geven die de opdracht onderscheidt van andere opdrachten die mogelijk dezelfde naam hebben. Voor cmdlets kunt u de module-gekwalificeerde naam gebruiken. Voor uitvoerbare bestanden kunt u de bestandsextensie opnemen. Als u bijvoorbeeld de uitvoerbare versie van where het gebruik where.exewilt uitvoeren.

Module-gekwalificeerde namen gebruiken

Met behulp van de module gekwalificeerde naam van een cmdlet kunt u opdrachten uitvoeren die zijn verborgen door een item met dezelfde naam. U kunt de cmdlet bijvoorbeeld uitvoeren door deze Get-Date te kwalificeren met de modulenaam Microsoft.PowerShell.Utility of het bijbehorende pad. Wanneer u module-gekwalificeerde namen gebruikt, kan de module automatisch worden geïmporteerd in de sessie, afhankelijk van de waarde van $PSModuleAutoLoadingPreference.

Notitie

U kunt modulenamen niet gebruiken om variabelen of aliassen in aanmerking te komen.

Als u module-gekwalificeerde namen gebruikt, zorgt u ervoor dat u de opdracht uitvoert die u wilt uitvoeren. Dit is de aanbevolen methode voor het aanroepen van cmdlets bij het schrijven van scripts die u wilt distribueren.

In het volgende voorbeeld ziet u hoe u een opdracht kunt kwalificeren door de naam van de module op te geven.

Belangrijk

Modulekwalificatie maakt gebruik van het backslash-teken (\) om de modulenaam te scheiden van de opdrachtnaam, ongeacht het platform.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM

Als u een New-Map opdracht vanuit de module wilt uitvoeren, gebruikt u de MapFunctions naam die is gekwalificeerd voor de module:

MapFunctions\New-Map

Gebruik de eigenschap ModuleName van opdrachten om de module te vinden waaruit een opdracht is geïmporteerd.

(Get-Command <command-name>).ModuleName

Als u bijvoorbeeld de bron van de Get-Date cmdlet wilt zoeken, typt u:

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

Als u de naam van de opdracht wilt kwalificeren met behulp van het pad naar de module, moet u de slash (/) als padscheidingsteken en het backslashteken (\) vóór de opdrachtnaam gebruiken. Gebruik het volgende voorbeeld om de Get-Date cmdlet uit te voeren:

//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

Het pad kan een volledig pad of een pad zijn dat relatief is ten opzichte van de huidige locatie. In Windows kunt u geen station-gekwalificeerde pad gebruiken. U moet een UNC-pad gebruiken, zoals wordt weergegeven in het vorige voorbeeld, of een pad dat ten opzichte van het huidige station is. In het volgende voorbeeld wordt ervan uitgegaan dat uw huidige locatie zich in het C: station bevindt.

/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

De oproepoperator gebruiken

U kunt ook de aanroepoperator (&) gebruiken om verborgen opdrachten uit te voeren door deze te combineren met een aanroep naar Get-ChildItem (de alias is dir) Get-Command of Get-Module.

De aanroepoperator voert tekenreeksen en scriptblokken uit in een onderliggend bereik. Zie about_Operators voor meer informatie.

Gebruik bijvoorbeeld de volgende opdracht om de functie uit te voeren die Map is verborgen door een alias met de naam Map.

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

or

& (dir Function:\map)

U kunt uw verborgen opdracht ook opslaan in een variabele, zodat u deze gemakkelijker kunt uitvoeren.

Met de volgende opdracht wordt bijvoorbeeld de Map functie opgeslagen in de $myMap variabele en wordt vervolgens de operator gebruikt om deze Call uit te voeren.

$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)

Vervangen items

Een vervangen item is een item dat u niet meer kunt openen. U kunt items vervangen door items met dezelfde naam uit een module te importeren.

Als u bijvoorbeeld een Get-Map functie in uw sessie typt en u een aangeroepen Get-Mapfunctie importeert, wordt de oorspronkelijke functie vervangen. U kunt deze niet ophalen in de huidige sessie.

Variabelen en aliassen kunnen niet worden verborgen omdat u geen aanroepoperator of gekwalificeerde naam kunt gebruiken om ze uit te voeren. Wanneer u variabelen en aliassen uit een module importeert, vervangen ze variabelen in de sessie door dezelfde naam.

Naamomzetting van cmdlets

Wanneer u de gekwalificeerde naam van een cmdlet niet gebruikt, controleert PowerShell of de cmdlet in de huidige sessie is geladen. Als er meerdere modules zijn geladen die dezelfde cmdletnaam bevatten, gebruikt PowerShell de cmdlet uit de eerste module die alfabetisch is gevonden.

Als de cmdlet niet is geladen, doorzoekt PowerShell de geïnstalleerde modules en laadt de eerste module die de cmdlet bevat en voert deze cmdlet uit. PowerShell zoekt naar modules in elk pad dat is gedefinieerd in de $env:PSModulePath omgevingsvariabele. De paden worden doorzocht in de volgorde waarin ze worden vermeld in de variabele. Binnen elk pad worden de modules in alfabetische volgorde doorzocht. PowerShell gebruikt de cmdlet van de eerste overeenkomst die wordt gevonden.

Naamconflicten voorkomen

De beste manier om conflicten met opdrachtnamen te beheren, is om deze te voorkomen. Wanneer u uw opdrachten een naam geeft, gebruikt u een unieke naam. Voeg bijvoorbeeld uw initialen of bedrijfsnaam toe aan de zelfstandige naamwoorden in uw opdrachten.

Wanneer u opdrachten in uw sessie importeert vanuit een PowerShell-module of vanuit een andere sessie, kunt u de Prefix parameter van de cmdlet Import-Module of Import-PSSession gebruiken om een voorvoegsel toe te voegen aan de zelfstandige naamwoorden in de namen van opdrachten.

Met de volgende opdracht voorkomt u bijvoorbeeld een conflict met de Get-Date cmdlets die Set-Date bij PowerShell worden geleverd wanneer u de DateFunctions module importeert.

Import-Module -Name DateFunctions -Prefix ZZ

Externe uitvoerbare bestanden uitvoeren

In Windows. PowerShell behandelt de bestandsextensies in de $env:PATHEXT omgevingsvariabele als uitvoerbare bestanden. Bestanden die geen Windows-uitvoerbare bestanden zijn, worden aan Windows overhandigd om te verwerken. Windows zoekt de bestandskoppeling op en voert de standaard Windows Shell-werkwoord voor de extensie uit. Windows moet worden geregistreerd bij het systeem om de uitvoering te ondersteunen met de bestandsextensie.

U kunt de uitvoerbare engine registreren voor een bestandsextensie met behulp van de ftype en assoc opdrachten van de CMD-opdrachtshell. PowerShell heeft geen directe methode om de bestandshandler te registreren. Zie de documentatie voor de opdracht ftype voor meer informatie.

Voor PowerShell om een bestandsextensie te zien als uitvoerbaar in de huidige sessie, moet u de extensie toevoegen aan de $env:PATHEXT omgevingsvariabele.

Zie ook