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.
- Alias
- Functie
- Cmdlet (zie naamomzetting voor cmdlets)
- 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 Help
en 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.exe
wilt 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-Map
functie 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.