Share via


Om kommandoprioritet

Kort beskrivning

Beskriver hur PowerShell avgör vilket kommando som ska köras.

Lång beskrivning

Kommandoprioritet 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.

Kommandoprioritet

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 FindDocs.ps1 skriptet i katalogen "C:\TechDocs":

C:\TechDocs\FindDocs.ps1

Som en säkerhetsfunktion kör PowerShell inte körbara (inbyggda) kommandon, inklusive PowerShell-skript, såvida inte kommandot finns i en sökväg som visas i variabeln $env:path Sökvägsmiljö eller om du inte anger sökvägen till skriptfilen.

Om du vill köra ett skript som finns i den aktuella katalogen anger du den fullständiga sökvägen eller skriver en punkt .\ som representerar den aktuella katalogen.

Om du till exempel vill köra filen FindDocs.ps1 i den aktuella katalogen skriver du:

.\FindDocs.ps1

Använda jokertecken vid körning

Du kan använda jokertecken i kommandokörningen. Att använda jokertecken kallas även globbing.

PowerShell kör en fil som har en jokerteckenmatchning före en literalmatchning.

Överväg till exempel en katalog med följande filer:

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

Båda skriptfilerna har samma innehåll: $MyInvocation.MyCommand.Path. Det här kommandot visar namnet på skriptet som anropas.

När du kör [a1].ps1körs filen a.ps1 trots att filen [a1].ps1 är en literalmatchning.

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

Nu ska vi ta bort a.ps1 filen och försöka köra den igen.

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

Du kan se från utdata som [a1].ps1 körs den här gången eftersom den literala matchningen är den enda filmatchningen för det jokerteckenmönstret.

Mer information om hur PowerShell använder jokertecken finns i about_Wildcards.

Anteckning

Om du vill begränsa sökningen till en relativ sökväg måste du föregå skriptnamnet med .\ sökvägen. Detta begränsar sökningen efter kommandon till filer i den relativa sökvägen. Utan det här prefixet kan andra PowerShell-syntaxer vara i konflikt och det finns få garantier för att filen hittas.

Om du inte anger någon sökväg använder PowerShell följande prioritetsordning när den kör kommandon för alla objekt som lästs in i den aktuella sessionen:

  1. Alias
  2. Funktion
  3. Cmdlet
  4. Externa körbara filer (program och icke-PowerShell-skript)

Om du skriver "hjälp" söker 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.

Anteckning

Detta gäller endast för inlästa kommandon. Om det finns en build körbar 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 i det här fallet. Det är bara när ingen extern körbar fil hittas som ett alias, en funktion eller en cmdlet med det angivna namnet anropas, vilket utlöser automatisk inläsning av modulen.

När sessionen innehåller objekt av samma typ som har samma namn kör PowerShell det nyare objektet.

Om du till exempel importerar en annan Get-Date cmdlet från en modul kör PowerShell den importerade versionen över den ursprungliga när du skriver Get-Date.

Dolda och ersatta objekt

Som ett resultat av dessa regler kan objekt ersättas eller döljas av objekt med samma namn.

Objekt är "dolda" eller "skuggade" om du fortfarande kan komma åt det ursprungliga objektet, till exempel genom att kvalificera objektnamnet med en modul eller ett snapin-namn.

Om du till exempel importerar en funktion som har samma namn som en cmdlet i sessionen är cmdleten dold (men inte ersatt) eftersom den har importerats från en snapin-modul eller modul.

Objekt "ersätts" eller "skrivs över" om du inte längre kan 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 och är inte längre tillgänglig. Du kan inte kvalificera en variabel med ett modulnamn.

Om du skriver en funktion på kommandoraden och sedan importerar en funktion med samma namn ersätts den ursprungliga funktionen och är inte längre tillgänglig.

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 bara 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 .

Följande kommando hämtar kommandot Get-Date som körs när du skriver Get-Date.

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

Följande kommando använder parametern Alla för att hämta alla Get-Date kommandon.

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

Köra dolda kommandon

Du kan köra vissa kommandon genom att ange objektegenskaper som skiljer kommandot från andra kommandon som kan ha samma namn. Du kan använda den här metoden för att köra alla kommandon, men det är särskilt användbart för att köra dolda kommandon.

Kvalificerade namn

Med 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.

Använd den här rekommenderade metoden när du skriver skript som du tänker distribuera. Du kan inte förutsäga vilka kommandon som kan finnas i den session där skriptet körs.

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

Om du vill köra ett New-Map kommando som har lagts till av 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 egenskapen ModuleName 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

Anteckning

Du kan inte kvalificera variabler eller alias.

Samtalsoperator

Du kan också använda operatorn Call& 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.

Om du till exempel har en funktion med namnet Map som är dold av ett alias med namnet Mapanvänder du följande kommando för att köra funktionen.

&(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 eller snapin-modul.

Om du till exempel skriver en Get-Map funktion i sessionen och importerar en funktion med namnet Get-Mapersätter den den ursprungliga funktionen. Det går inte att 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 eller snapin-modul ersätter de variabler i sessionen med samma namn.

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 använder du parametern Prefixför Import-Module eller

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

Mer information finns i Import-Module och Import-PSSession nedan.

Se även