Megosztás a következőn keresztül:


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 az aktuális könyvtárban szeretné futtatni a FindDocs.ps1 fájlt, í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. Álnév
  2. Funkció
  3. Parancsmag (lásd parancsmagok névfeloldási)
  4. Külső végrehajtható fájlok (beleértve a PowerShell-szkriptfájlokat)

Ezért ha helpír be, a PowerShell először egy helpnevű aliast keres, majd egy helpnevű függvényt, végül pedig egy helpnevű parancsmagot. Futtatja az első help elemet, amelyet megtalál.

Ha például a munkamenet egy parancsmagot és egy Get-Mapnevű függvényt tartalmaz, Get-Mapbeírásakor a PowerShell futtatja a függvényt.

Jegyzet

Ez csak a betöltött parancsokra vonatkozik. Ha egy build végrehajtható és egy alias build egy olyan modulban Invoke-Build nevű függvényhez, 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 rejtett vagy árnyékolt, 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 a 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.

Ha az elemeket lecserélik vagy felülírt , az eredeti elem már nem érhető el.

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 összes paramétere lekéri az összes parancsot a megadott névvel, még akkor is, ha rejtettek vagy lecserélték őket. A PowerShell 3.0-tól kezdve alapértelmezés szerint Get-Command csak a parancsnév beírásakor futtatott parancsokat kapja meg.

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

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

A All 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 where végrehajtható verziójának futtatásához használja a where.exe.

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 úgy, hogy a modulnévvel Microsoft.PowerShell.Utility vagy elérési útjával minősíti. A modul által minősített nevek használata esetén a modul automatikusan importálható a munkamenetbe a $PSModuleAutoLoadingPreferenceértékétől függően.

Jegyzet

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, a platformtól függetlenül.

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

Ha New-Map parancsot szeretne futtatni a MapFunctions modulból, használja a modul által minősített nevet:

MapFunctions\New-Map

Ha meg szeretné keresni azt a modult, amelyből egy parancsot importált, használja a parancsok ModuleName tulajdonságát.

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

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

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

Ha a modul elérési útjával szeretné minősíteni a parancs nevét, akkor a parancs neve előtt a perjelet (/) kell használnia elérési útelválasztóként és fordított perjel karakterként (\). Az alábbi példában futtassa a Get-Date parancsmagot:

//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őt (&) is használhatja rejtett parancsok futtatásához, ha Get-ChildItem hívásával kombinálja (az alias dir), Get-Command vagy Get-Module.

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

A következő paranccsal futtathatja például a Map nevű függvényt, amelyet egy Mapnevű alias rejtett el.

& (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 a Call operátorral futtatja.

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

Lecserélt elemek

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

Ha például beír egy Get-Map függvényt a munkamenetbe, és importál egy Get-Mapnevű fü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 $Env:PSModulePath környezeti változóban definiált minden útvonalon 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, a parancsok nevében a Prefix vagy Import-PSSession parancsmag paraméterével adhat hozzá előtagot a főnevekhez.

Az alábbi parancs például elkerüli a PowerShellhez tartozó Get-Date és Set-Date parancsmagokkal való ütközést a DateFunctions modul importálásakor.

Import-Module -Name DateFunctions -Prefix ZZ

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

Windows rendszeren. A PowerShell végrehajtható fájlként kezeli az $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 regisztrálhatja egy fájlkiterjesztéshez a CMD parancshéj ftype és assoc parancsaival. A PowerShell nem rendelkezik közvetlen módszerrel a fájlkezelő regisztrálásához. További információt a ftype parancs dokumentációjában talál.

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