Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Rövid leírás
Ismerteti, hogyan elemzi a PowerShell a parancsokat.
Hosszú leírás
Amikor parancsot ad meg a parancssorban, a PowerShell a parancsszöveget jogkivonatok nevű szegmensek sorozatára bontja, majd meghatározza az egyes tokenek értelmezésének módját.
Ha például a következőt írja be:
Write-Host book
A PowerShell két jogkivonatra bontja a parancsot, Write-Host és book, és egymástól függetlenül értelmezi az egyes jogkivonatokat két fő elemzési mód egyikével: a kifejezésmóddal és az argumentum móddal.
Megjegyzés:
Amikor a PowerShell elemzi a parancs bemenetét, parancsmagokra vagy natív végrehajtható fájlokra próbálja feloldani a parancsneveket. Ha egy parancsnévnek nincs pontos egyezése, a PowerShell alapértelmezésként hozzáfűzi a Get--t a parancshoz, mint alapértelmezett igét. Például a PowerShell a Service értéket Get-Service-ként elemzi. A következő okok miatt nem ajánlott ezt a funkciót használni:
- Nem hatékony. Emiatt a PowerShell többszöri kereséseket végez.
- Az azonos nevű külső programok először kerülnek kezelésre, így előfordulhat, hogy nem futtatja a kívánt cmdletet.
-
Get-HelpésGet-Commandnem ismerik fel az igék nélküli neveket. - A parancs neve lehet fenntartott szó vagy nyelvi kulcsszó.
Processmindkettő, és nem lehetGet-Process-hez kapcsolni.
Kifejezésmód
A kifejezésmód a kifejezések kombinálására szolgál, amely a szkriptnyelvben az értékkezeléshez szükséges. A kifejezések a PowerShell szintaxisában szereplő értékek ábrázolásai, amelyek lehetnek egyszerűek vagy összetettek, például:
A literális kifejezések az értékük közvetlen ábrázolásai:
'hello'
32
A változókifejezések a hivatkozott változó értékét hordozzák:
$x
$script:path
Az operátorok más kifejezéseket is kombinálnak a kiértékeléshez:
-12
-not $Quiet
3 + 7
$input.Length -gt 1
- Karakterlánc literáloknak idézőjelek között kell lenniük.
- A számok nem karaktersorozatként, hanem számértékként kezelik (kivéve, ha nem szökik meg).
-
Operátorok, beleértve az olyan nem szereplő operátorokat, mint a
-, a-notés a bináris operátorok, például a+és a-gt, operátorként értelmezik, és az argumentumaikra (operandusaikra) alkalmazzák a megfelelő műveleteket. -
attribútum- és konverziós kifejezések kifejezésként vannak elemezve, és az alárendelt kifejezésekre lesznek alkalmazva. Például:
[int] '7'. - változóhivatkozások kiértékelése az értékükre történik, de splatting tilos, és elemzési hibát okoz.
- A rendszer minden mást meghívandó parancsként kezel.
Argumentum mód
Elemzéskor a PowerShell először kifejezésként értelmezi a bemenetet. Ha azonban parancshívás történik, az elemzés argumentum módban folytatódik. Ha olyan argumentumokkal rendelkezik, amelyek szóközöket, például elérési utakat tartalmaznak, akkor ezeket az argumentumértékeket idézőjelekbe kell ágyaznia.
Az argumentum-üzemmód a shell környezet parancsainak argumentumainak és paramétereinek elemzésére szolgál. Az összes bemenet kibontható sztringként lesz kezelve, kivéve, ha az alábbi szintaxisok egyikét használja:
A dollárjel (
$), amelyet egy változónév követ, egy változóhivatkozást kezd; ellenkező esetben a bővíthető sztring részeként értelmezendő. A változóhivatkozás tartalmazhat taghozzáférést vagy indexelést.- Az egyszerű változóhivatkozásokat (például
$HOME) követő további karakterek is ugyanannak az argumentumnak a részei. A változó nevét kapcsos zárójelekbe ({}) csatolja, hogy elválasztsa a következő karakterektől. Például:${HOME}. - Ha a változóhivatkozás taghozzáférést tartalmaz, a további karakterek közül az első lesz az új argumentum kezdete.
$HOME.Length-morepéldául két argumentumot eredményez: a$HOME.Lengthértékét és a sztringkonstans-moreértékét.
- Az egyszerű változóhivatkozásokat (például
Az idézőjelek (
'és") karakterláncokat kezdenek.Kapcsos zárójelek (
{}) új szkriptblokkok létrehozásaA vesszők (
,) azokat a listákat vezetik be, amelyeket tömbökként adnak át, kivéve, ha a meghívott parancs egy natív alkalmazás. Ebben az esetben a vesszőket a bővíthető sztring részeként értelmezik. A kezdeti, egymást követő vagy záró vesszők nem támogatottak.A zárójelek (
()) egy új kifejezést kezdenek.A subexpression operátor (
$()) beágyazott kifejezést kezdA kezdeti @ jel (
@) olyan kifejezésszintaxisokat kezd el, mint a splatting (@args), a tömbök (@(1,2,3)) és a hashtábla literálok (@{a=1;b=2}).(),$()és@()a token elején hozzanak létre egy új elemzési környezetet, amely kifejezéseket vagy beágyazott parancsokat tartalmazhat.- Ha további karaktereket követ, az első további karakter egy új, különálló argumentum kezdetének számít.
- Amikor egy idézőjelek nélküli literális
$()-t követ, akkor bővíthető karakterláncként működik. A()egy új argumentumot kezd, amely egy kifejezés, míg a@()-t szó szerint veszik, és a@-ra. A()pedig egy új argumentumot indít el, amely szintén egy kifejezés.
Minden mást bővíthető karakterláncként kezelünk, kivéve azokat a metakaraktereket, amelyeket ki kell kerülni. Lásd: Speciális karakterek kezelése.
- Az argumentum módú metadiagramok (speciális szintaktikai jelentésű karakterek) a következők:
<space> ' " ` , ; ( ) { } | & < > @ #. Ezek közül< > @ #csak a token elején különlegesek.
- Az argumentum módú metadiagramok (speciális szintaktikai jelentésű karakterek) a következők:
A stop-parsing token (
--%) megváltoztatja az összes fennmaradó argumentum értelmezését. További információkért lásd az alábbi elemző-törlési token szakaszt.
Példák
Az alábbi táblázat számos példát mutat be a kifejezés- és argumentum módban feldolgozott jogkivonatokra, valamint a jogkivonatok kiértékeléséhez. Ezekben a példákban a $a változó értéke 4.
| példa | Üzemmód | Eredmény |
|---|---|---|
2 |
Kifejezés | 2 (egész szám) |
`2 |
Kifejezés | "2" (parancs) |
Write-Output 2 |
Kifejezés | 2 (egész szám) |
2+2 |
Kifejezés | 4 (egész szám) |
Write-Output 2+2 |
érvelés | 2+2 |
Write-Output(2+2) |
Kifejezés | 4 (egész szám) |
$a |
Kifejezés | 4 (egész szám) |
Write-Output $a |
Kifejezés | 4 (egész szám) |
$a+2 |
Kifejezés | 6 (egész szám) |
Write-Output $a+2 |
érvelés | "4+2" (sztring) |
$- |
érvelés | "$-" (parancs) |
Write-Output $- |
érvelés | "$-" (sztring) |
a$a |
Kifejezés | a$a (parancs) |
Write-Output a$a |
érvelés | "a4" (karaktersorozat) |
a'$a' |
Kifejezés | a$a (parancs) |
Write-Output a'$a' |
érvelés | a$a (sztring) |
a"$a" |
Kifejezés | a$a (parancs) |
Write-Output a"$a" |
érvelés | "a4" (karaktersorozat) |
a$(2) |
Kifejezés | "a$(2)" (parancs) |
Write-Output a$(2) |
érvelés | "A2" (karakterlánc) |
Minden jogkivonat valamilyen objektumtípusként értelmezhető, például logikai vagy karakterlánc. A PowerShell megkísérli meghatározni a kifejezés objektumtípusát. Az objektum típusa attól függ, hogy a parancs milyen típusú paramétert vár el, és hogy a PowerShell tudja-e, hogyan konvertálja az argumentumot a megfelelő típusra. Az alábbi táblázat több példát mutat be a kifejezések által visszaadott értékekhez rendelt típusokra.
| példa | Üzemmód | Eredmény |
|---|---|---|
Write-Output !1 |
argumentum | "!1" (sztring) |
Write-Output (!1) |
kifejezés | Hamis (logikai érték) |
Write-Output (2) |
kifejezés | 2 (egész szám) |
Set-Variable AB A,B |
argumentum | 'A','B' (tömb) |
CMD /CECHO A,B |
argumentum | "A,B" (sztring) |
CMD /CECHO $AB |
kifejezés | "A B" (tömb) |
CMD /CECHO :$AB |
argumentum | ':A B' (sztring) |
Speciális karakterek kezelése
A backtick karakter (`) a kifejezés bármely speciális karakterének feloldására használható. Ez a leginkább hasznos az argumentum-üzemmódú metakarakterek kiszabadítására, amelyeket szó szerinti karakterként szeretne használni, nem pedig metakarakterként. Ha például a dollárjelet ($) literálként szeretné használni egy bővíthető sztringben:
"The value of `$ErrorActionPreference is '$ErrorActionPreference'."
The value of $ErrorActionPreference is 'Continue'.
Sor folytatása
A backtick karakter a sor végén is használható, így a következő sorban is folytatódhat a bevitel. Ez javítja egy olyan parancs olvashatóságát, amely több hosszú nevet és argumentumértéket tartalmazó paramétert használ. Például:
New-AzVm `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM" `
-Location "EastUS" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-Credential $cred
Azonban ne használjon sor-folytatást.
- A háttérkarakterek nehezen láthatók és könnyen felejthetők el.
- Egy extra szóköz a backtick után megszakítja a sor folytatását. Mivel a hely nehezen látható, nehéz lehet megtalálni a hibát.
A PowerShell többféle módon is megszakítja a vonalakat a szintaxis természetes pontjain.
- Csőkarakterek után (
|) - Bináris operátorok (
+,-,-eqstb.) után - Vessző (
,) után egy tömbben - Az olyan karakterek megnyitása után, mint
[,{,(
Nagy paraméterkészlet esetén használjon inkább "splatting" technikát. Például:
$parameters = @{
ResourceGroupName = "myResourceGroupVM"
Name = "myVM"
Location = "EastUS"
VirtualNetworkName = "myVnet"
SubnetName = "mySubnet"
SecurityGroupName = "myNetworkSecurityGroup"
PublicIpAddressName = "myPublicIpAddress"
Credential = $cred
}
New-AzVm @parameters
Argumentumok átadása natív parancsoknak
Ha natív parancsokat futtat a PowerShellből, az argumentumokat először a PowerShell elemzi. Az elemzett argumentumok ezután egyetlen sztringbe lesznek illesztve, és mindegyik paramétert szóköz választja el egymástól.
A következő parancs például meghívja a icacls.exe programot.
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
A parancs PowerShell 2.0-s futtatásához menekülő karaktereket kell használnia ahhoz, hogy a PowerShell ne értelmezze félre a zárójeleket.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
Az elemzést megállító token
A PowerShell 3.0-tól kezdve a stop-parsing (--%) jogkivonat használatával megakadályozhatja, hogy a PowerShell PowerShell-parancsok vagy kifejezésekként értelmezze a bemenetet.
Megjegyzés:
A stop-parsing token csak natív parancsok használatára szolgál Windows-platformokon.
Natív parancs meghívásakor helyezze a stop-parsing tokent a programargumentumok elé. Ez a technika sokkal egyszerűbb, mint a menekülési karakterek használata a félreértelmezés megakadályozása érdekében.
Amikor szintaxis elemzés leállításának tokenjével találkozik, a PowerShell a sor többi karakterét literálisként kezeli. Az egyetlen értelmezés, amelyet végrehajt, az a szabványos Windows-jelölést használó környezeti változók értékeinek helyettesítése, például %USERPROFILE%.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
A PowerShell a következő parancssztringet küldi a icacls.exe programnak:
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
A stop-parsing token csak a következő új vonal vagy folyamat karakterig érvényes. A sorfolytatási karakter (`) nem használható a hatás kiterjesztéséhez, és nem használhat parancselválasztót (;) a hatás megszakításához.
A %variable% környezeti változókra mutató hivatkozásokon kívül más dinamikus elemeket nem ágyazhat be a parancsba. A % karakterek %%-re való megadására nincs támogatás, úgy mint ahogyan a batch fájlokban megtehető.
%<name>% tokenek mindig bővülnek. Ha <name> nem hivatkozik egy meghatározott környezeti változóra, akkor a token át lesz adva as-is-nak.
A stream átirányítása (például >file.txt) nem használható, mert azokat változatlan formában adják át a célparancsnak argumentumként.
Az alábbi példában az első lépés a stop-parsing jogkivonat használata nélkül futtat egy parancsot. A PowerShell kiértékeli az idézett sztringet, és átadja az értéket (idézőjelek nélkül) cmd.exe, ami hibát eredményez.
PS> cmd /c echo "a|b"
'b' is not recognized as an internal or external command,
operable program or batch file.
PS> cmd /c --% echo "a|b"
"a|b"
Megjegyzés:
A stop-parsing tokenre nincs szükség PowerShell-parancsmagok használatakor. Hasznos lehet azonban argumentumokat átadni egy Olyan PowerShell-függvénynek, amely úgy van kialakítva, hogy natív parancsot hívjon meg ezekkel az argumentumokkal.
Idézőjeleket tartalmazó argumentumok átadása
Egyes natív parancsok idézőjeleket tartalmazó argumentumokat várnak. A PowerShell 7.3 módosította a parancssor natív parancsokhoz való elemzésének módját.
Figyelmeztetés
Az új viselkedés a Windows PowerShell 5.1-es viselkedésének kompatibilitástörő változása . Ez megszakíthatja a szkripteket és az automatizálást, amelyek a natív alkalmazások meghívása során felmerülő különböző problémákat megkerülik. A stop-parsing token (--%) vagy a Start-Process parancsmag használatával elkerülheti a natív argumentum szükség szerinti átadását.
Ezt a viselkedést az új $PSNativeCommandArgumentPassing beállításváltozó vezérli. Ez a változó lehetővé teszi, hogy futásidőben válassza ki a viselkedést. Az érvényes értékek a következők: Legacy, Standardés Windows. Az alapértelmezett viselkedés platformspecifikus. Windows-platformokon az alapértelmezett beállítás Windows, a nem Windows-platformok pedig alapértelmezés szerint Standard.
Legacy a történelmi viselkedés. A Windows és a Standard mód működése ugyanaz, kivéve abban az esetben, ha Windows módban az alábbi fájlok meghívásai automatikusan a Legacy stílus szerinti argumentumátadást használják.
cmd.execscript.exewscript.exe- végződés
.bat - végződés
.cmd - végződés
.js - végződés
.vbs - végződés
.wsf
Ha a $PSNativeCommandArgumentPassingLegacy vagy Standardértékre van állítva, az elemző nem ellenőrzi ezeket a fájlokat.
Megjegyzés:
Az alábbi példák a TestExe.exe eszközt használják. A forráskódból létrehozhat TestExe. Lásd TestExe a PowerShell-forrásadattárban.
A módosítás által elérhetővé tett új viselkedések:
Az idézőjeleket tartalmazó szó szerinti vagy bővíthető karakterláncok most már megőrződnek.
PS> $a = 'a" "b' PS> TestExe -echoargs $a 'c" "d' e" "f Arg 0 is <a" "b> Arg 1 is <c" "d> Arg 2 is <e f>Az argumentumként üres láncok mostantól megmaradnak:
PS> TestExe -echoargs '' a b '' Arg 0 is <> Arg 1 is <a> Arg 2 is <b> Arg 3 is <>
Ezeknek a példáknak a célja, hogy a címtár elérési útját (szóközökkel és idézőjelekkel) egy natív parancsnak "C:\Program Files (x86)\Microsoft\" adja át, hogy idézőjeles sztringként kapja meg az elérési utat.
Windows vagy Standard módban a következő példák adják meg a várt eredményeket:
TestExe -echoargs """${env:ProgramFiles(x86)}\Microsoft\"""
TestExe -echoargs '"C:\Program Files (x86)\Microsoft\"'
Ha ugyanazt az eredményt szeretné elérni Legacy módban, el kell menekülnie az idézőjelek elől, vagy a stop-parsing tokent (--%) kell használnia:
TestExe -echoargs """""${env:ProgramFiles(x86)}\Microsoft\\"""""
TestExe -echoargs "\""C:\Program Files (x86)\Microsoft\\"""
TestExe -echoargs --% ""\""C:\Program Files (x86)\Microsoft\\"\"""
TestExe -echoargs --% """C:\Program Files (x86)\Microsoft\\""
TestExe -echoargs --% """%ProgramFiles(x86)%\Microsoft\\""
Megjegyzés:
A fordított perjel (\) karaktert a PowerShell nem ismeri fel escape karakterként. Ez a ProcessStartInfo.ArgumentListmögöttes API által használt escape karakter.
A PowerShell 7.3 emellett lehetővé tette a natív parancsok paraméterkötésének nyomon követését is. További információért lásd: Trace-Command.
Argumentumok továbbítása PowerShell-parancsoknak
A PowerShell 3.0-tól kezdve a paraméterek végi token (--) használatával megakadályozhatja, hogy a PowerShell PowerShell-paraméterekként értelmezze a bemenetet. Ez egy konvenció, amelyet a POSIX Shell és a Utilities specifikáció határoz meg.
A paraméterek végét jelző token
A paraméterek végi jogkivonat (--) azt jelzi, hogy az azt követő összes argumentumot a tényleges formájukban kell átadni, mintha dupla idézőjelek lettek volna elhelyezve körülöttük. A -- használatával például idézőjelek használata vagy paraméterként való értelmezése nélkül is kiadhatja a -InputObject sztringet:
Write-Output -- -InputObject
-InputObject
A stop-parsing (--%) jogkivonattól eltérően a -- jogkivonatot követő összes érték kifejezésként értelmezhető a PowerShellben.
Write-Output -- -InputObject $env:PROCESSOR_ARCHITECTURE
-InputObject
AMD64
Ez a viselkedés csak a PowerShell-parancsokra vonatkozik. Ha a -- tokent külső parancs meghívásakor használja, a -- sztring argumentumként adódik át a parancsnak.
TestExe -echoargs -a -b -- -c
A kimenet azt mutatja, hogy a -- argumentumként át van adva a TestExe-nek.
Arg 0 is <-a>
Arg 1 is <-b>
Arg 2 is <-->
Arg 3 is <-c>
Tilde (~)
A tilde karakter (~) különleges jelentéssel bír a PowerShellben. Ha az elérési út elején PowerShell-parancsokkal használják, a tilde karakter ki lesz bontva a felhasználó kezdőlapjára. Ha a tilde karaktert bárhol máshol használják az elérési úton, akkor a rendszer konstans karakterként kezeli.
PS D:\temp> $PWD
Path
----
D:\temp
PS D:\temp> Set-Location ~
PS C:\Users\user2> $PWD
Path
----
C:\Users\user2
Ebben a példában a Név paramétere a New-Item egy karakterláncot vár. A tilde karaktert a rendszer literális karakterként kezeli. Az újonnan létrehozott könyvtárra való váltáshoz az elérési utat a tilde karakterrel kell minősíteni.
PS D:\temp> Set-Location ~
PS C:\Users\user2> New-Item -Type Directory -Name ~
Directory: C:\Users\user2
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 5/6/2024 2:08 PM ~
PS C:\Users\user2> Set-Location ~
PS C:\Users\user2> Set-Location .\~
PS C:\Users\user2\~> $PWD
Path
----
C:\Users\user2\~
Ha natív parancsokkal használja a tilde karaktert, a PowerShell konstans karakterként adja át a tilde karaktert. A tilde elérési útban való használata hibákat okoz a windowsos natív parancsok esetében, amelyek nem támogatják a tilde karaktert.
PS D:\temp> $PWD
Path
----
D:\temp
PS D:\temp> Get-Item ~\repocache.clixml
Directory: C:\Users\user2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 4/29/2024 3:42 PM 88177 repocache.clixml
PS D:\temp> more.com ~\repocache.clixml
Cannot access file D:\temp\~\repocache.clixml