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 FindDocs.ps1 script uitgevoerd in de map C:\TechDocs:

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 omgevingsvariabele $Env:PATH.

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 in de huidige map wilt uitvoeren, 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 cmdlet naamomzetting)
  4. Externe uitvoerbare bestanden (inclusief PowerShell-scriptbestanden)

Als u helptypt, zoekt PowerShell eerst naar een alias met de naam help, vervolgens een functie met de naam helpen ten slotte 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, worden beide benoemd Get-Map, wanneer u Get-Maptypt, 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 in een module die niet in de huidige sessie is geladen, wordt in PowerShell het build uitvoerbaar 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 worden verborgen of 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, wordt de cmdlet verborgen, maar niet vervangen. U kunt de cmdlet uitvoeren door de module-gekwalificeerde naam op te geven.

Wanneer items 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 Alle van de cmdlet Get-Command worden alle opdrachten opgehaald met de opgegeven naam, zelfs als deze verborgen of vervangen zijn. Vanaf PowerShell 3.0 krijgt Get-Command standaard alleen de opdrachten 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 Get-Command gebruiken 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 wilt uitvoeren, gebruikt u where.exe.

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 Get-Date cmdlet bijvoorbeeld uitvoeren door deze 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 wilt uitvoeren vanuit de MapFunctions-module, gebruikt u de naam van de module die is gekwalificeerd:

MapFunctions\New-Map

Als u de module wilt vinden waaruit een opdracht is geïmporteerd, gebruikt u de eigenschap ModuleName van opdrachten.

(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 (/) gebruiken als padscheidingsteken en het backslashteken (\) vóór de opdrachtnaam. 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 scriptblokkeringen uit in een onderliggend bereik. Zie about_Operatorsvoor meer informatie.

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

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

of

& (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 functie Map opgeslagen in de $myMap variabele en wordt vervolgens de operator Call gebruikt om deze 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 functie importeert met de naam Get-Map, 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 omgevingsvariabele $Env:PSModulePath. 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 parameter Prefix van de Import-Module- of Import-PSSession cmdlet 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- en Set-Date-cmdlets die 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 die worden vermeld in de omgevingsvariabele $Env:PATHEXT 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 voor een bestandsextensie registreren 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 omgevingsvariabele $Env:PATHEXT.

Zie ook