about_Command_Precedence
Kort beskrivning
Beskriver hur PowerShell avgör vilket kommando som ska köras.
Lång beskrivning
Kommandopriorence beskriver hur PowerShell avgör vilket kommando som ska köras när en session innehåller fler än ett kommando med samma namn. Kommandon i en session kan döljas eller ersättas av kommandon med samma namn. Den här artikeln visar hur du kör dolda kommandon och hur du undviker konflikter med kommandonamn.
Kommandopriorence
När en PowerShell-session innehåller fler än ett kommando som har samma namn avgör PowerShell vilket kommando som ska köras med hjälp av följande regler.
Om du anger sökvägen till ett kommando kör PowerShell kommandot på den plats som anges av sökvägen.
Följande kommando kör till exempel skriptet FindDocs.ps1 i C:\TechDocs
katalogen:
C:\TechDocs\FindDocs.ps1
Du kan köra alla körbara kommandon med hjälp av dess fullständiga sökväg. Som en säkerhetsfunktion kör PowerShell inte körbara kommandon, inklusive PowerShell-skript och interna kommandon, såvida inte kommandot finns i en sökväg som anges i $env:Path
miljövariabeln.
Om du vill köra en körbar fil som finns i den aktuella katalogen anger du den fullständiga sökvägen eller använder den relativa sökvägen .\
för att representera den aktuella katalogen.
Om du till exempel vill köra FindDocs.ps1
filen i den aktuella katalogen skriver du:
.\FindDocs.ps1
Om du inte anger en sökväg använder PowerShell följande prioritetsordning när den kör kommandon.
- Alias
- Funktion
- Cmdlet (se Cmdlet-namnmatchning)
- Externa körbara filer (inklusive PowerShell-skriptfiler)
Om du skriver help
letar PowerShell först efter ett alias med namnet help
, sedan en funktion med namnet Help
och slutligen en cmdlet med namnet Help
. Det kör det första help
objektet som hittas.
Om din session till exempel innehåller en cmdlet och en funktion, båda med namnet Get-Map
, när du skriver Get-Map
, kör PowerShell funktionen.
Kommentar
Detta gäller endast för inlästa kommandon. Om det finns en build
körbar fil och ett alias build
för en funktion med namnet Invoke-Build
på inuti en modul som inte läses in i den aktuella sessionen, kör PowerShell den build
körbara filen i stället. Den läser inte in moduler automatiskt om den hittar den externa körbara filen. Det är först när ingen extern körbar fil hittas som ett alias, en funktion eller en cmdlet med det angivna namnet anropas.
Lösa objekt med samma namn
Som ett resultat av dessa regler kan objekt ersättas eller döljas av objekt med samma namn.
Objekt döljs eller skuggas om du fortfarande kan komma åt det ursprungliga objektet, till exempel genom att kvalificera objektnamnet med ett modulnamn.
Om du till exempel importerar en funktion som har samma namn som en cmdlet i sessionen är cmdleten dold men inte ersatt. Du kan köra cmdleten genom att ange dess modulkvalificerade namn.
När objekt ersätts eller skrivs över kan du inte längre komma åt det ursprungliga objektet.
Om du till exempel importerar en variabel som har samma namn som en variabel i sessionen ersätts den ursprungliga variabeln. Du kan inte kvalificera en variabel med ett modulnamn.
Om du skapar en funktion på kommandoraden och sedan importerar en funktion med samma namn ersätts den ursprungliga funktionen.
Hitta dolda kommandon
Parametern Alla i cmdleten Get-Command hämtar alla kommandon med det angivna namnet, även om de är dolda eller ersatta. Från och med PowerShell 3.0 hämtas som standard Get-Command
endast de kommandon som körs när du skriver kommandonamnet.
I följande exempel innehåller sessionen en Get-Date
funktion och en Get-Date-cmdlet . Du kan använda Get-Command
för att avgöra vilket kommando som väljs först.
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Använder parametern Alla för att visa tillgängliga Get-Date
kommandon.
Get-Command Get-Date -All
CommandType Name Version Source
----------- ---- ------- ------
Function Get-Date
Cmdlet Get-Date 3.1.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
Du kan köra vissa kommandon genom att inkludera kvalificerande information som skiljer kommandot från andra kommandon som kan ha samma namn.
För cmdletar kan du använda det modulkvalificerade namnet. För körbara filer kan du inkludera filtillägget. Om du till exempel vill köra den körbara versionen av where
användningen where.exe
.
Använda modulkvalificerade namn
Med hjälp av det modulkvalificerade namnet på en cmdlet kan du köra kommandon som döljs av ett objekt med samma namn. Du kan till exempel köra cmdleten Get-Date
genom att kvalificera den med dess modulnamn Microsoft.PowerShell.Utility eller dess sökväg. När du använder modulkvalificerade namn kan modulen automatiskt importeras till sessionen beroende på värdet $PSModuleAutoLoadingPreference
för .
Kommentar
Du kan inte använda modulnamn för att kvalificera variabler eller alias.
Med hjälp av modulkvalificerade namn ser du till att du kör kommandot som du tänker köra. Det här är den rekommenderade metoden för att anropa cmdletar när du skriver skript som du tänker distribuera.
I följande exempel visas hur du kvalificerar ett kommando genom att inkludera dess modulnamn.
Viktigt!
Modulkvalificering använder omvänt snedstreck (\
) för att skilja modulnamnet från kommandonamnet, oavsett plattform.
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM
Om du vill köra ett New-Map
kommando från modulen MapFunctions
använder du dess modulkvalificerade namn:
MapFunctions\New-Map
Om du vill hitta modulen från vilken ett kommando importerades använder du modulename-egenskapen för kommandon.
(Get-Command <command-name>).ModuleName
Om du till exempel vill hitta källan till cmdleten Get-Date
skriver du:
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
Om du vill kvalificera namnet på kommandot med hjälp av sökvägen till modulen måste du använda snedstrecket (/
) som sökvägsavgränsare och omvänt snedstreck (\
) före kommandonamnet. Använd följande exempel för att köra cmdleten Get-Date
:
//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Sökvägen kan vara en fullständig sökväg eller en sökväg som är relativ till den aktuella platsen.
I Windows kan du inte använda en enhetskvalificerad sökväg. Du måste använda en UNC-sökväg, som du ser i föregående exempel, eller en sökväg som är relativ till den aktuella enheten.
I följande exempel förutsätts att din aktuella plats finns på C:
enheten.
/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Använda samtalsoperatorn
Du kan också använda anropsoperatorn (&
) för att köra dolda kommandon genom att kombinera den med ett anrop till Get-ChildItem (aliaset är dir
) Get-Command
eller Get-Module.
Anropsoperatorn kör strängar och skriptblock i ett underordnat omfång. Mer information finns i about_Operators.
Använd till exempel följande kommando för att köra funktionen med namnet Map
som är dold av ett alias med namnet Map
.
& (Get-Command -Name Map -CommandType Function)
eller
& (dir Function:\map)
Du kan också spara det dolda kommandot i en variabel för att göra det enklare att köra.
Följande kommando sparar Map
till exempel funktionen i variabeln $myMap
och använder sedan operatorn Call
för att köra den.
$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)
Ersatta objekt
Ett ersatt objekt är ett objekt som du inte längre kan komma åt. Du kan ersätta objekt genom att importera objekt med samma namn från en modul.
Om du till exempel skriver en Get-Map
funktion i sessionen och importerar en funktion med namnet Get-Map
ersätter den den ursprungliga funktionen. Du kan inte hämta den i den aktuella sessionen.
Variabler och alias kan inte döljas eftersom du inte kan använda en anropsoperator eller ett kvalificerat namn för att köra dem. När du importerar variabler och alias från en modul ersätter de variabler i sessionen med samma namn.
Cmdlet-namnmatchning
När du inte använder det kvalificerade namnet på en cmdlet kontrollerar PowerShell om cmdleten läses in i den aktuella sessionen. Om det finns flera inlästa moduler som innehåller samma cmdlet-namn använder PowerShell cmdleten från den första modulen som hittades alfabetiskt.
Om cmdleten inte läses in söker PowerShell igenom de installerade modulerna och läser in den första modulen automatiskt som innehåller cmdleten och kör cmdleten.
PowerShell söker efter moduler i varje sökväg som definierats i $env:PSModulePath
miljövariabeln. Sökvägarna genomsöks i den ordning som de visas i variabeln. Inom varje sökväg genomsöks modulerna i alfabetisk ordning. PowerShell använder cmdleten från den första matchningen som hittas.
Undvika namnkonflikter
Det bästa sättet att hantera konflikter med kommandonamn är att förhindra dem. När du namnger dina kommandon använder du ett unikt namn. Du kan till exempel lägga till dina initialer eller företagsnamnsakronymen i substantiven i dina kommandon.
När du importerar kommandon till sessionen från en PowerShell-modul eller från en annan session kan du använda parametern Prefix
för cmdleten Import-Module eller Import-PSSession för att lägga till ett prefix i substantiven i namnen på kommandona.
Följande kommando undviker till exempel eventuella konflikter med Get-Date
cmdletarna och Set-Date
som medföljer PowerShell när du importerar modulen DateFunctions
.
Import-Module -Name DateFunctions -Prefix ZZ
Köra externa körbara filer
I Windows. PowerShell behandlar filnamnstilläggen $env:PATHEXT
som anges i miljövariabeln som körbara filer. Filer som inte är körbara Windows-filer överlämnas till Windows för att bearbetas. Windows letar upp filassociationen och kör standardverb för Windows Shell för tillägget. För att Windows ska kunna stödja körningen av filnamnstillägget måste associationen registreras med systemet.
Du kan registrera den körbara motorn för ett filnamnstillägg med hjälp ftype
av kommandona och assoc
för CMD-kommandogränssnittet. PowerShell har ingen direkt metod för att registrera filhanteraren. Mer information finns i dokumentationen för ftype-kommandot .
För att PowerShell ska kunna se ett filnamnstillägg som körbart i den aktuella sessionen måste du lägga till tillägget i $env:PATHEXT
miljövariabeln.