about_Command_Precedence

Rövid leírás

Ismerteti, hogy a PowerShell hogyan határozza meg a futtatandó parancsot.

Hosszú leírás

A parancsok elsőbbsége azt ismerteti, hogyan határozza meg a PowerShell, hogy melyik parancs fusson, ha egy munkamenet több, azonos nevű parancsot tartalmaz. A munkameneten belüli parancsok elrejthetők vagy lecserélhetők ugyanazzal a névvel rendelkező parancsokkal. Ez a cikk bemutatja, hogyan futtathat rejtett parancsokat, és hogyan kerülheti el a parancsnevek ütközését.

Parancs elsőbbsége

Ha egy PowerShell-munkamenet több, azonos nevű parancsot tartalmaz, a PowerShell az alábbi szabályok alapján határozza meg, hogy melyik parancs fusson.

Ha megadja a parancs elérési útját, a PowerShell az elérési út által megadott helyen futtatja a parancsot.

A következő parancs például a FindDocs.ps1 szkriptet futtatja a C:\TechDocs könyvtárban:

C:\TechDocs\FindDocs.ps1

Bármilyen végrehajtható parancsot futtathat a teljes elérési út használatával. Biztonsági funkcióként a PowerShell nem futtat végrehajtható parancsokat, beleértve a PowerShell-szkripteket és a natív parancsokat, kivéve, ha a parancs a $env:Path környezeti változóban felsorolt elérési úton található.

Az aktuális könyvtárban található végrehajtható fájl futtatásához adja meg a teljes elérési utat, vagy használja a relatív elérési utat .\ az aktuális könyvtár megjelenítéséhez.

Ha például a fájlt az FindDocs.ps1 aktuális könyvtárban szeretné futtatni, írja be a következőt:

.\FindDocs.ps1

Ha nem ad meg elérési utat, a PowerShell a következő sorrendet használja a parancsok futtatásakor.

  1. Alias
  2. Függvény
  3. Parancsmag (lásd a parancsmagok névfeloldását)
  4. Külső végrehajtható fájlok (beleértve a PowerShell-szkriptfájlokat)

Ezért ha beírja help, a PowerShell először egy aliast helpkeres, majd egy névvel ellátott Helpfüggvényt, végül pedig egy parancsmagot Help. Az első help megtalált elemet futtatja.

Ha például a munkamenet tartalmaz egy parancsmagot és egy függvényt, mindkettő neve Get-Map, amikor beírja Get-Map, a PowerShell futtatja a függvényt.

Feljegyzés

Ez csak a betöltött parancsokra vonatkozik. Ha van végrehajtható build és alias build egy olyan függvényhez, amelynek a neve Invoke-Build egy olyan modulon belül van, amely nincs betöltve az aktuális munkamenetbe, a PowerShell futtatja helyette a build végrehajthatót. Nem tölti be automatikusan a modulokat, ha a külső végrehajtható fájlt találja. A rendszer csak akkor hívja meg az aliast, függvényt vagy parancsmagot, ha nem található külső végrehajtható fájl.

Azonos nevű elemek feloldása

Ezeknek a szabályoknak köszönhetően az elemek lecserélhetők vagy elrejthetők ugyanazzal a névvel.

Az elemek rejtettek vagy árnyékoltak, ha továbbra is hozzáférhet az eredeti elemhez, például az elem nevének modulnévvel való minősítésével.

Ha például olyan függvényt importál, amelynek neve megegyezik a munkamenet parancsmagjának nevével, a parancsmag rejtett, de nem cserélődik le. A parancsmagot a modul által minősített név megadásával futtathatja.

Az elemek cseréje vagy felülírása után már nem férhet hozzá az eredeti elemhez.

Ha például olyan változót importál, amelynek a neve megegyezik a munkamenet egyik változójának nevével, az eredeti változó helyébe lép. Nem minősíthet modulnévvel rendelkező változót.

Ha létrehoz egy függvényt a parancssorban, majd importál egy azonos nevű függvényt, az eredeti függvény helyébe lép.

Rejtett parancsok keresése

A Get-Command parancsmag All paramétere a megadott névvel rendelkező összes parancsot lekéri, még akkor is, ha rejtettek vagy lecserélték őket. A PowerShell 3.0-tól kezdődően alapértelmezés szerint Get-Command csak a parancsnév beírásakor futtatott parancsok lesznek lekérve.

Az alábbi példákban a munkamenet egy függvényt és egy Get-DateGet-Date parancsmagot tartalmaz. Get-Command Segítségével meghatározhatja, hogy melyik parancsot válassza ki először.

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

Az Összes paraméter használatával listázhatja az elérhető Get-Date parancsokat.

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

Bizonyos parancsokat úgy futtathat, hogy olyan megfelelő információkat tartalmaz, amelyek megkülönböztetik a parancsot más, azonos nevű parancsoktól. Parancsmagok esetén használhatja a modul által minősített nevet. Végrehajtható fájlok esetén a fájlkiterjesztést is belefoglalhatja. Például a végrehajtható használati where.exeverzió where futtatásához.

Modul által minősített nevek használata

A parancsmag modul által minősített nevének használatával futtathat olyan parancsokat, amelyeket egy azonos nevű elem rejtett el. Futtathatja például a Get-Date parancsmagot a Microsoft.PowerShell.Utility modulnévvel vagy elérési útjával való minősítéssel. A modul által minősített nevek használata esetén a modul a modul értékétől $PSModuleAutoLoadingPreferencefüggően automatikusan importálható a munkamenetbe.

Feljegyzés

Nem használhat modulneveket változók vagy aliasok minősítéséhez.

A modul által minősített nevek használatával biztosítható, hogy a futtatni kívánt parancsot futtassa. Ez a parancsmagok hívásának ajánlott módja, amikor olyan szkripteket ír, amelyeket el szeretne terjeszteni.

Az alábbi példa bemutatja, hogyan minősíthet egy parancsot a modul nevének megadásával.

Fontos

A modul minősítése a fordított perjel karakter (\) használatával választja el a modul nevét a parancs nevétől, függetlenül a platformtól.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM

A modulból származó parancs futtatásához New-Map használja a MapFunctions modul által minősített nevet:

MapFunctions\New-Map

Annak a modulnak a megkereséséhez, amelyből egy parancsot importált, használja a parancsok ModuleName tulajdonságát.

(Get-Command <command-name>).ModuleName

A parancsmag forrásának megkereséséhez például írja be a Get-Date következőt:

(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility

Ha a modul elérési útján szeretné minősíteni a parancs nevét, akkor a parancs neve előtt az előre perjelet (/) kell használnia elérési útelválasztóként és fordított perjel karakterként (\). A parancsmag futtatásához használja az Get-Date alábbi példát:

//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

Az elérési út lehet teljes elérési út vagy az aktuális helyhez viszonyított elérési út. Windows rendszeren nem használhat meghajtóval minősített elérési utat. Az előző példában látható UNC elérési utat vagy az aktuális meghajtóhoz viszonyított elérési utat kell használnia. Az alábbi példa feltételezi, hogy az aktuális hely a C: meghajtón található.

/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

A híváskezelő használata

A híváskezelővel (&) rejtett parancsokat is futtathat, ha a Get-ChildItem (aliasadir) Get-Command vagy a Get-Module hívásával kombinálja.

A híváskezelő sztringeket és szkriptblokkokat hajt végre egy gyermekhatókörben. További információ: about_Operators.

Az alábbi paranccsal futtathatja például a rejtett alias által rejtett függvényt MapMap.

& (Get-Command -Name Map -CommandType Function)

vagy

& (dir Function:\map)

A rejtett parancsot egy változóba is mentheti, hogy egyszerűbb legyen a futtatás.

Az alábbi parancs például menti a Map függvényt a $myMap változóban, majd az Call operátorral futtatja.

$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)

Lecserélt elemek

A lecserélt elemek már nem érhetők el. Az elemeket lecserélheti úgy, hogy importálja az azonos nevű elemeket egy modulból.

Ha például beír egy függvényt Get-Map a munkamenetbe, és importál egy úgynevezett Get-Mapfüggvényt, az felülírja az eredeti függvényt. Az aktuális munkamenetben nem kérhető le.

A változók és aliasok nem rejthetők el, mert nem használhat híváskezelőt vagy minősített nevet a futtatásukhoz. Amikor változókat és aliasokat importál egy modulból, a munkamenet változóit ugyanazzal a névvel helyettesítik.

Parancsmagok névfeloldási megoldása

Ha nem használja a parancsmag minősített nevét, a PowerShell ellenőrzi, hogy a parancsmag betöltve van-e az aktuális munkamenetben. Ha több olyan modul van betöltve, amely ugyanazt a parancsmagnevet tartalmazza, a PowerShell az első, betűrendben talált modul parancsmagjait használja.

Ha a parancsmag nincs betöltve, a PowerShell megkeresi a telepített modulokat, és automatikusan betölti a parancsmagot tartalmazó első modult, és futtatja a parancsmagot. A PowerShell a környezeti változóban definiált egyes elérési utakon $env:PSModulePath keres modulokat. Az elérési utak keresésének sorrendje a változóban szerepel. Az egyes útvonalakon belül a modulok betűrendben keresnek. A PowerShell az első találatból származó parancsmagot használja.

Névütközések elkerülése

A parancsnévütközések kezelésének legjobb módja az, ha megakadályozza őket. Ha elnevezi a parancsokat, használjon egyedi nevet. Adja hozzá például a monogramját vagy a cégnév rövidítését a parancsok főneveihez.

Amikor parancsokat importál a munkamenetbe Egy PowerShell-modulból vagy egy másik munkamenetből, az Prefix Import-Module vagy az Import-PSSession parancsmag paraméterével hozzáadhat egy előtagot a parancsok neveihez.

Az alábbi parancs például elkerüli a Get-Date PowerShell-lel a modul importálása során használt parancsmagokkal és Set-Date parancsmagokkal való ütközést DateFunctions .

Import-Module -Name DateFunctions -Prefix ZZ

Külső végrehajtható elemek futtatása

Windows rendszeren. A PowerShell végrehajtható fájlokként kezeli a $env:PATHEXT környezeti változóban felsorolt fájlkiterjesztéseket. A nem Windows-végrehajtható fájlok feldolgozása a Windowsnak történik. A Windows megkeresi a fájltársítást, és végrehajtja a bővítmény alapértelmezett Windows Shell-parancsát. Ahhoz, hogy a Windows fájlkiterjesztéssel támogassa a végrehajtást, a társítást regisztrálni kell a rendszerben.

A végrehajtható motort a CMD parancshéj és assoc parancsai ftype segítségével regisztrálhatja egy fájlkiterjesztéshez. A PowerShell nem rendelkezik közvetlen módszerrel a fájlkezelő regisztrálásához. További információkért tekintse meg az ftype parancs dokumentációját.

Ahhoz, hogy a PowerShell egy fájlkiterjesztést végrehajthatóként láthassa az aktuális munkamenetben, hozzá kell adnia a bővítményt a $env:PATHEXT környezeti változóhoz.

Lásd még