Dela via


Om parsning

KORT BESKRIVNING

Beskriver hur PowerShell parsar kommandon.

LÅNG BESKRIVNING

När du anger ett kommando i kommandotolken delar PowerShell upp kommandotexten i en serie segment som kallas token och bestämmer sedan hur varje token ska tolkas.

Om du till exempel skriver:

Write-Host book

PowerShell delar upp kommandot i två token och Write-Hostbook, och tolkar varje token oberoende av varandra med något av två huvudsakliga parsningslägen: uttrycksläge och argumentläge.

Anteckning

När PowerShell parsar kommandoindata försöker det matcha kommandonamnen med cmdletar eller interna körbara filer. Om ett kommandonamn inte har en exakt matchning förbereder Get- PowerShell kommandot som ett standardverb. PowerShell parsar Process till exempel som Get-Process. Vi rekommenderar inte att du använder den här funktionen av följande skäl:

  • Det är ineffektivt. Detta gör att PowerShell söker flera gånger.
  • Externa program med samma namn matchas först, så du får inte köra avsedd cmdlet.
  • Get-Help och Get-Command känner inte igen verblösa namn.

Uttrycksläge

Uttrycksläget är avsett att kombinera uttryck som krävs för värdemanipulering på ett skriptspråk. Uttryck är representationer av värden i PowerShell-syntax och kan vara enkla eller sammansatta, till exempel:

Literaluttryck är direkta representationer av deras värden:

'hello', 32

Variabeluttryck bär värdet för variabeln som de refererar till:

$x, $script:path

Operatorer kombinerar andra uttryck för utvärdering:

- 12, -not $Quiet, 3 + 7, $input.Length -gt 1
  • Teckensträngsliteraraler måste finnas inom citattecken.
  • Tal behandlas som numeriska värden i stället för som en serie tecken (om de inte är undantagna).
  • Operatorer, inklusive enställiga operatorer som - och -not och binära operatorer som + och -gt, tolkas som operatorer och tillämpar sina respektive åtgärder på sina argument (operander).
  • Attribut- och konverteringsuttryck parsas som uttryck och tillämpas på underordnade uttryck, t.ex. [int] '7'.
  • Variabelreferenser utvärderas till deras värden, men det är förbjudet att klistra in förifyllda parameteruppsättningar och orsakar ett parsningsfel .
  • Allt annat behandlas som ett kommando som ska anropas.

Argumentläge

Vid parsning ser PowerShell först ut att tolka indata som ett uttryck. Men när ett kommandoanrop påträffas fortsätter parsningen i argumentläge.

Argumentläget är utformat för att parsa argument och parametrar för kommandon i en gränssnittsmiljö. Alla indata behandlas som en expanderbar sträng om den inte använder någon av följande syntaxer:

  • Dollartecknet ($) börjar en variabelreferens (endast om den följs av ett giltigt variabelnamn, annars tolkas det som en del av den expanderbara strängen).
  • Citattecken (' och ") börjar strängvärden
  • Parenteser (( och )) avgränsar nya uttryck.
  • Underuttrycksoperatorn ($(...)) avgränsar inbäddade uttryck.
  • Klammerparenteser ({ och }) avgränsar nya skriptblock.
  • Initial vid tecknet (@) börjar uttryckssyntaxer som splatting (@args), matriser (@(1,2,3)) och hash-tabeller (@{a=1;b=2}).
  • Kommatecken (,) introducerar listor som skickas som matriser, förutom när kommandot som ska anropas är ett internt program, i vilket fall de tolkas som en del av den expanderbara strängen. Initiala, efterföljande eller avslutande kommatecken stöds inte.

Värden för inbäddade uttryck konverteras till strängar.

Följande tabell innehåller flera exempel på värden som bearbetas i uttrycksläge och argumentläge samt utvärdering av dessa värden. Vi antar att värdet för variabeln a är 4.

Exempel Läge Resultat
2 Uttryck 2 (heltal)
`2 Uttryck "2" (kommando)
echo 2 Uttryck 2 (heltal)
2+2 Uttryck 4 (heltal)
echo 2+2 Argument "2+2" (sträng)
echo(2+2) Uttryck 4 (heltal)
$a Uttryck 4 (heltal)
echo $a Uttryck 4 (heltal)
$a+2 Uttryck 6 (heltal)
echo $a+2 Argument 4+2 (sträng)
$- Argument "$-" (kommando)
echo $- Argument "$-" (sträng)
a$a Uttryck "a$a" (kommando)
echo a$a Argument "a4" (sträng)
a'$a' Uttryck "a$a" (kommando)
echo a'$a' Argument "a$a" (sträng)
a"$a" Uttryck "a$a" (kommando)
echo a"$a" Argument "a4" (sträng)
a$(2) Uttryck "a$(2)" (kommando)
echo a$(2) Argument "a2" (sträng)

Varje token kan tolkas som någon typ av objekttyp, till exempel boolesk eller sträng. PowerShell försöker fastställa objekttypen från uttrycket. Objekttypen beror på vilken typ av parameter ett kommando förväntar sig och om PowerShell vet hur argumentet ska konverteras till rätt typ. I följande tabell visas flera exempel på de typer som tilldelats värden som returneras av uttrycken.

Exempel Läge Resultat
Write-Output !1 -argument "!1" (sträng)
Write-Output (!1) uttryck Falskt (booleskt)
Write-Output (2) uttryck 2 (heltal)
Set-Variable AB A,B -argument 'A','B' (matris)
CMD /CECHO A,B -argument 'A,B' (sträng)
CMD /CECHO $AB uttryck 'A','B' (matris)
CMD /CECHO :$AB -argument ':A B' (sträng)

Stoppparsningssymbolen (--%), som introducerades i PowerShell 3.0, instruerar PowerShell att avstå från att tolka indata som PowerShell-kommandon eller -uttryck.

När du anropar ett körbart program i PowerShell placerar du stoppparsing-symbolen före programargumenten. Den här tekniken är mycket enklare än att använda escape-tecken för att förhindra feltolkning.

När den stöter på en stoppparsing-symbol behandlar PowerShell de återstående tecknen på raden som en literal. Den enda tolkning som utförs är att ersätta värden för miljövariabler som använder standard-Windows-notation, till exempel %USERPROFILE%.

Stoppparsing-symbolen gäller endast fram till nästa nya rad- eller pipelinetecken. Du kan inte använda ett fortsättningstecken (`) för att utöka dess effekt eller använda en kommandogränsare (;) för att avsluta dess effekt.

Följande kommando anropar till exempel Icacls-programmet .

icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

Om du vill köra det här kommandot i PowerShell 2.0 måste du använda escape-tecken för att förhindra att PowerShell feltolkar parenteserna.

icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F

Från och med PowerShell 3.0 kan du använda stoppparsing-symbolen.

icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

PowerShell skickar följande kommandosträng till Icacls-programmet :

X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

Anteckning

Stoppparsingsymbolen är endast avsedd för användning på Windows-plattformar.

SE ÄVEN

about_Command_Syntax