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.
- Alias
- Függvény
- Parancsmag (lásd a parancsmagok névfeloldását)
- 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 help
keres, majd egy névvel ellátott Help
fü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-Date
Get-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.exe
verzió 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 $PSModuleAutoLoadingPreference
fü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 Map
Map
.
& (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-Map
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 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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: