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 wordt beschreven hoe u verborgen opdrachten uitvoert en hoe u conflicten tussen opdrachten en namen kunt voorkomen.

Opdrachtprioriteit

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 is opgegeven door het pad.

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, inclusief 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 aan te geven.

Als u het FindDocs.ps1 bestand bijvoorbeeld 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 Cmdlet-naamomzetting)
  4. Externe uitvoerbare bestanden (inclusief PowerShell-scriptbestanden)

Als u typt help, zoekt PowerShell daarom 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 met de naam Get-Map, wordt de functie door PowerShell uitgevoerd wanneer u typt Get-Map.

Notitie

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

Items met dezelfde naam oplossen

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

Items worden verborgen of met schaduw weergegeven 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 die dezelfde naam heeft als een cmdlet in de sessie, wordt de cmdlet verborgen, maar niet vervangen. U kunt de cmdlet uitvoeren door de 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 die dezelfde naam heeft 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 met de opgegeven naam opgehaald, zelfs als ze zijn verborgen of vervangen. Vanaf PowerShell 3.0 Get-Command krijgt 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 cmdlet Get-Date . U kunt gebruiken Get-Command om te bepalen welke opdracht als eerste wordt gekozen.

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

Hiermee gebruikt u de parameter All 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 door de module gekwalificeerde naam gebruiken. Voor uitvoerbare bestanden kunt u de bestandsextensie opnemen. Als u bijvoorbeeld de uitvoerbare versie van where gebruikt, gebruikt u where.exe.

Door module gekwalificeerde namen gebruiken

Met behulp van de door 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 door de module gekwalificeerde namen gebruikt, kan de module automatisch worden geïmporteerd in de sessie, afhankelijk van de waarde van $PSModuleAutoLoadingPreference.

Notitie

U kunt geen modulenamen gebruiken om variabelen of aliassen te kwalificeren.

Als u door de 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 gebruikt 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 module, gebruikt u de naam van de MapFunctions module:

MapFunctions\New-Map

Als u de module wilt zoeken 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 (/) 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 zijn of een pad dat relatief is ten opzichte van de huidige locatie. In Windows kunt u geen met een station gekwalificeerd pad gebruiken. U moet een UNC-pad gebruiken, zoals weergegeven in het vorige voorbeeld, of een pad dat relatief is ten opzichte van het huidige station. 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 met de naam Map uit te voeren die wordt 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 om deze gemakkelijker uit te voeren.

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 waartoe u geen toegang meer hebt. 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 een gekwalificeerde naam kunt gebruiken om ze uit te voeren. Wanneer u variabelen en aliassen uit een module importeert, vervangen deze variabelen in de sessie met dezelfde naam.

Cmdlet-naamomzetting

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 wordt de eerste module die de cmdlet bevat automatisch geladen en wordt die cmdlet uitgevoerd. 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 door deze te voorkomen. Gebruik een unieke naam wanneer u uw opdrachten een naam geeft. Voeg bijvoorbeeld uw initialen of bedrijfsnaam acroniem toe aan de zelfstandige naamwoorden in uw opdrachten.

Wanneer u opdrachten vanuit een PowerShell-module of een andere sessie in uw sessie importeert, 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 conflicten met de Get-Date cmdlets en Set-Date 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 $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 het standaardwerkwoord Windows Shell uit voor de extensie. Windows ondersteunt alleen de uitvoering door de bestandsextensie als de koppeling is geregistreerd bij het systeem.

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

PowerShell kan een bestandsextensie alleen zien als uitvoerbaar in de huidige sessie als u de extensie toevoegt aan de omgevingsvariabele $env:PATHEXT .

Zie ook