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 map C:\TechDocs:

C:\TechDocs\FindDocs.ps1

Als beveiligingsfunctie voert PowerShell geen uitvoerbare (systeemeigen) opdrachten uit, inclusief PowerShell-scripts, tenzij de opdracht zich in een pad bevindt dat wordt vermeld in de omgevingsvariabele $env:path Pad of tenzij u het pad naar het scriptbestand opgeeft.

Als u een script wilt uitvoeren dat zich in de huidige map bevindt, geeft u het volledige pad op of typt u een punt .\ om de huidige map weer te geven.

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

.\FindDocs.ps1

Jokertekens gebruiken in de uitvoering

U kunt jokertekens gebruiken bij het uitvoeren van de opdracht. Het gebruik van jokertekens wordt ook wel globbing genoemd.

PowerShell voert een bestand met een jokertekenovereenkomst uit vóór een letterlijke overeenkomst.

Denk bijvoorbeeld aan een map met de volgende bestanden:

Get-ChildItem C:\temp\test


    Directory: C:\temp\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        5/20/2019   2:29 PM             28 a.ps1
-a----        5/20/2019   2:29 PM             28 [a1].ps1

Beide scriptbestanden hebben dezelfde inhoud: $MyInvocation.MyCommand.Path. Met deze opdracht wordt de naam weergegeven van het script dat wordt aangeroepen.

Wanneer u uitvoert [a1].ps1, wordt het bestand a.ps1 uitgevoerd, ook al is het [a1].ps1 een letterlijke overeenkomst.

C:\temp\test\[a1].ps1
C:\temp\test\a.ps1

Nu gaan we het a.ps1 bestand verwijderen en proberen het opnieuw uit te voeren.

Remove-Item C:\temp\test\a.ps1
C:\temp\test\[a1].ps1
C:\temp\test\[a1].ps1

U kunt zien in de uitvoer die [a1].ps1 deze keer wordt uitgevoerd, omdat de letterlijke overeenkomst de enige bestandsovereenkomst is voor dat jokertekenpatroon.

Zie about_Wildcards voor meer informatie over hoe PowerShell jokertekens gebruikt.

Notitie

Als u de zoekopdracht wilt beperken tot een relatief pad, moet u de scriptnaam vooraf laten gaan door het .\ pad. Dit beperkt het zoeken naar opdrachten tot bestanden in dat relatieve pad. Zonder dit voorvoegsel kan andere PowerShell-syntaxis conflicteert en zijn er weinig garanties dat het bestand wordt gevonden.

Als u geen pad opgeeft, gebruikt PowerShell de volgende prioriteitsvolgorde wanneer opdrachten worden uitgevoerd voor alle items die in de huidige sessie zijn geladen:

  1. Alias
  2. Functie
  3. Cmdlet
  4. Externe uitvoerbare bestanden (programma's en niet-PowerShell-scripts)

Als u 'help' typt, 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 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 in dit geval 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, waardoor automatisch laden van de module wordt geactiveerd.

Wanneer de sessie items van hetzelfde type bevat die dezelfde naam hebben, wordt het nieuwere item uitgevoerd.

Als u bijvoorbeeld een andere Get-Date cmdlet uit een module importeert en u typt Get-Date, wordt de geïmporteerde versie uitgevoerd via de systeemeigen versie.

Verborgen en vervangen items

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

Items zijn 'verborgen' of 'schaduw' als u nog steeds toegang hebt tot het oorspronkelijke item, bijvoorbeeld door de naam van het item te kwalificeren met een module- of modulenaam.

Als u bijvoorbeeld een functie importeert die dezelfde naam heeft als een cmdlet in de sessie, wordt de cmdlet verborgen (maar niet vervangen) omdat deze is geïmporteerd vanuit een module of module.

Items worden 'vervangen' of 'overschreven' als u geen toegang meer hebt 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 en is deze niet meer toegankelijk. U kunt een variabele niet kwalificeren met een modulenaam.

Als u een functie typt op de opdrachtregel en vervolgens een functie met dezelfde naam importeert, wordt de oorspronkelijke functie vervangen en is deze niet meer toegankelijk.

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 .

Met de volgende opdracht wordt de Get-Date opdracht opgevraagd die wordt uitgevoerd wanneer u typt Get-Date.

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

De volgende opdracht gebruikt de parameter All om alle Get-Date opdrachten op te halen.

Get-Command Get-Date -All
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date
Cmdlet          Get-Date                  Microsoft.PowerShell.Utility

Verborgen opdrachten uitvoeren

U kunt bepaalde opdrachten uitvoeren door itemeigenschappen op te geven die de opdracht onderscheiden van andere opdrachten die mogelijk dezelfde naam hebben. U kunt deze methode gebruiken om elke opdracht uit te voeren, maar het is vooral handig voor het uitvoeren van verborgen opdrachten.

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.

Gebruik deze voorkeursmethode bij het schrijven van scripts die u wilt distribueren. U kunt niet voorspellen welke opdrachten aanwezig kunnen zijn in de sessie waarin het script wordt uitgevoerd.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, September 4, 2018 8:17:25 AM

Als u een New-Map opdracht wilt uitvoeren die door de module is toegevoegd, gebruikt u de door de MapFunctions module gekwalificeerde naam:

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

Notitie

U kunt variabelen of aliassen niet kwalificeren.

De oproepoperator gebruiken

U kunt de Call operator & ook 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.

Als u bijvoorbeeld een functie met de naam Map hebt die is verborgen door een alias met de naam Map, gebruikt u de volgende opdracht om de functie uit te voeren.

&(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 te importeren uit een module of module.

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 of module importeert, vervangen deze variabelen in de sessie met dezelfde naam.

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 in uw sessie importeert vanuit een PowerShell-module of vanuit een andere sessie, gebruikt u ook de Prefix parameter van de Import-Module of

Import-PSSession-cmdlet 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

PowerShell behandelt de bestandsextensies die worden vermeld in de $env:PATHEXT omgevingsvariabele als uitvoerbare bestanden. Uitvoerbare Windows-bestanden zijn bestanden met .COM, .CPLof .EXE bestandsextensies. Uitvoerbare Windows-bestanden en andere bestanden met extensies die worden vermeld in $env:PATHEXT , worden uitgevoerd in de huidige consolesessie.

Bestanden die geen uitvoerbare Windows-bestanden zijn, worden aan Windows overgedragen 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