Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Popisuje, jak PowerShell analyzuje příkazy.
Dlouhý popis
Když zadáte příkaz na příkazovém řádku, PowerShell rozdělí text příkazu do řady segmentů, které se nazývají tokeny a pak určí, jak interpretovat jednotlivé tokeny.
Pokud například zadáte:
Write-Host book
PowerShell rozdělí příkaz na dva tokeny, Write-Host a booka interpretuje každý token nezávisle pomocí jednoho ze dvou hlavních režimů analýzy: režim výrazu a režim argumentů.
Poznámka:
Když PowerShell analyzuje vstup příkazu, pokusí se přeložit názvy příkazů na rutiny nebo nativní spustitelné soubory. Pokud název příkazu nemá přesnou shodu, PowerShell přiřadí Get- příkaz před příkaz jako výchozí příkaz. PowerShell například analyzuje Process jako Get-Process. Tuto funkci nedoporučujeme používat z následujících důvodů:
- Je neefektivní. To způsobí, že PowerShell bude prohledávat vícekrát.
- Externí programy se stejným názvem jsou vyřešeny jako první, takže není možné spustit zamýšlenou rutinu.
-
Get-HelpaGet-Commandnerozpoznávají názvy bez sloves.
Režim výrazu
Režim výrazů je určený ke kombinování výrazů, které jsou vyžadovány pro manipulaci s hodnotami ve skriptovacím jazyce. Výrazy představují reprezentaci hodnot v syntaxi PowerShellu a můžou být jednoduché nebo složené, například:
Literální výrazy představují přímé vyjádření jejich hodnot:
'hello'
32
Výrazy proměnných mají hodnotu proměnné, na kterou odkazují:
$x
$script:path
Operátory kombinují další výrazy pro vyhodnocení:
-12
-not $Quiet
3 + 7
$input.Length -gt 1
- řetězcové literály znaků musí být obsaženy v uvozovkách.
- čísla jsou považovány za číselné hodnoty, nikoli jako řadu znaků (pokud nejsou uchycené).
-
Operátory, včetně unárních operátorů, jako jsou
-a-nota binární operátory, jako jsou+a-gt, jsou interpretovány jako operátory a aplikují jejich příslušné operace na argumenty (operandy). -
Atributové a převodní výrazy jsou analyzovány jako výrazy a aplikovány na podřízené výrazy, např.
[int] '7'. - Odkazy na proměnné jsou vyhodnocovány podle svých hodnot, ale splatting (tj. vkládání předvyplněných sad parametrů) je zakázán a způsobuje chybu analyzátoru.
- Cokoli jiného bude považováno za příkaz, který má být vyvolán.
Režim argumentu
Při analýze powershell nejprve interpretuje vstup jako výraz. Při vyvolání příkazu ale probíhá analýza v režimu argumentu. Pokud máte argumenty, které obsahují mezery, například cesty, musíte tyto hodnoty argumentů uzavřít do uvozovek.
Režim argumentů je určený pro analýzu argumentů a parametrů pro příkazy v prostředí. Veškerý vstup se považuje za rozbalitelný řetězec, pokud nepoužívá jednu z následujících syntaxí:
Znak dolaru (
$) následovaný názvem proměnné začíná odkazem na proměnnou, jinak je interpretován jako součást rozbalitelného řetězce. Odkaz na proměnnou může zahrnovat přístup ke členům nebo indexování.- Další znaky za jednoduchými odkazy na proměnné, například
$HOME, jsou považovány za součást stejného argumentu. Uzavřete název proměnné do složených závorek ({}) a oddělte ho od následných znaků. Například:${HOME}. - Pokud odkaz na proměnnou zahrnuje přístup členů, první ze všech dalších znaků se považuje za začátek nového argumentu. Například
$HOME.Length-moremá za výsledek dva argumenty: hodnotu$HOME.Lengtha řetězcový literál-more.
- Další znaky za jednoduchými odkazy na proměnné, například
Počáteční řetězce uvozovek (
'a")Složené závorky (
{}) začínají nový blok skriptu.Čárky (
,) uvádějí seznamy předávané jako pole, s výjimkou případů, kdy je příkaz, který má být volán, nativní aplikace, v takovém případě jsou interpretovány jako součást rozbalitelného řetězce. Čárky na začátku, po sobě jdoucí nebo na konci nejsou podporovány.Závorky (
()) začínají novým výrazemOperátor dílčího výrazu (
$()) začíná vloženým výrazem.Počáteční znak (
@) začíná syntaxe výrazů, jako je splatting (@args), pole (@(1,2,3)) a literály tabulky hash (@{a=1;b=2}).(),$()a@()na začátku tokenu vytvoří nový kontext analýzy, který může obsahovat výrazy nebo vnořené příkazy.- Když následuje další znaky, první další znak se považuje za začátek nového samostatného argumentu.
- Pokud mu předchází literál
$()bez uvozovek, funguje jako rozšiřitelný řetězec,()začíná nový argument, který je výrazem, a@()je brán jako literál@se()začátkem nového argumentu, který je výrazem.
Všechno ostatní je považováno za rozbalitelný řetězec, s výjimkou metacharacterů, které stále potřebují utéct.
- Metacharaktery v režimu argumentu (znaky se speciálním syntaktickým významem) jsou:
<space> ' " ` , ; ( ) { } | & < > @ #. Z těchto jsou< > @ #speciální pouze na začátku tokenu.
- Metacharaktery v režimu argumentu (znaky se speciálním syntaktickým významem) jsou:
Token zastavení zpracovávání (
--%) změní interpretaci všech zbývajících argumentů. Další informace najdete níže v části týkající se tokenu pro zastavení zpracování.
Příklady
Následující tabulka obsahuje několik příkladů tokenů zpracovaných v režimu výrazů a v režimu argumentů a vyhodnocení těchto tokenů. V těchto příkladech je hodnota proměnné $a4.
| Příklad | Režim | Výsledek |
|---|---|---|
2 |
Výraz | 2 (celé číslo) |
`2 |
Výraz | "2" (příkaz) |
Write-Output 2 |
Výraz | 2 (celé číslo) |
2+2 |
Výraz | 4 (celé číslo) |
Write-Output 2+2 |
Důvod | "2+2" (řetězec) |
Write-Output(2+2) |
Výraz | 4 (celé číslo) |
$a |
Výraz | 4 (celé číslo) |
Write-Output $a |
Výraz | 4 (celé číslo) |
$a+2 |
Výraz | 6 (celé číslo) |
Write-Output $a+2 |
Důvod | "4+2" (řetězec) |
$- |
Důvod | "$-" (příkaz) |
Write-Output $- |
Důvod | "$-" (řetězec) |
a$a |
Výraz | "a$a" (příkaz) |
Write-Output a$a |
Důvod | "a4" (řetězec) |
a'$a' |
Výraz | "a$a" (příkaz) |
Write-Output a'$a' |
Důvod | a$a (řetězec) |
a"$a" |
Výraz | "a$a" (příkaz) |
Write-Output a"$a" |
Důvod | "a4" (řetězec) |
a$(2) |
Výraz | "a$(2)" (příkaz) |
Write-Output a$(2) |
Důvod | "a2" (řetězec) |
Každý token lze interpretovat jako určitý druh typu objektu, například boolean nebo String. PowerShell se pokusí určit typ objektu z výrazu. Typ objektu závisí na typu parametru, který příkaz očekává, a na tom, jestli PowerShell ví, jak převést argument na správný typ. Následující tabulka uvádí několik příkladů typů přiřazených hodnotám, které vracejí výrazy.
| Příklad | Režim | Výsledek |
|---|---|---|
Write-Output !1 |
argument | "!1" (řetězec) |
Write-Output (!1) |
výraz | Nepravda (logická hodnota) |
Write-Output (2) |
výraz | 2 (celé číslo) |
Set-Variable AB A,B |
argument | "A", "B" (pole) |
CMD /CECHO A,B |
argument | "A,B" (řetězec) |
CMD /CECHO $AB |
výraz | A B (matice) |
CMD /CECHO :$AB |
argument | ':A B' (řetězec) |
Předávání argumentů nativním příkazům
Při spouštění nativních příkazů z PowerShellu se argumenty nejprve parsují pomocí PowerShellu. Analyzované argumenty se pak spojí do jednoho řetězce s každým parametrem odděleným mezerou.
Například následující příkaz volá program icacls.exe.
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Pokud chcete tento příkaz spustit v PowerShellu 2.0, musíte použít řídicí znaky, abyste zabránili chybné interpretaci závorek v PowerShellu.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
Token zastavení analýzy
Počínaje PowerShellem 3.0 můžete pomocí tokenu zastavení analýzy (--%) zastavit interpretaci vstupu v PowerShellu jako příkazů nebo výrazů PowerShellu.
Poznámka:
Token stop-parsování je určen pouze pro použití na platformách Windows.
Při volání nativního příkazu před argumenty programu umístěte token stop-parsing. Tato technika je mnohem jednodušší než použití řídicích znaků, aby se zabránilo nesprávné interpretaci.
Když narazí na token pro zastavení parsování, PowerShell považuje zbylé znaky na řádku za literál. Jedinou interpretací, kterou provádí, je nahradit hodnoty proměnných prostředí, které používají standardní notaci systému Windows, například %USERPROFILE%.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
PowerShell odešle do icacls.exe programu následující příkazový řetězec:
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Token pro zastavení parsování je efektivní jen do dalšího znaku nového řádku nebo roury. Nemůžete použít pokračovací znak (`) k rozšíření jeho účinku ani použít oddělovač příkazů (;) k ukončení jeho účinku.
%variable% Kromě odkazů na proměnné prostředí nelze do příkazu vložit žádné jiné dynamické prvky. Uvozovací % znak jako %%, jak to můžete dělat uvnitř dávkových souborů, není podporován.
%<name>% tokeny se neustále rozšiřují. Pokud <name> neodkazuje na definovanou proměnnou prostředí, token se předá přes as-is.
Přesměrování datového proudu (například >file.txt) nelze použít, protože jsou předávány doslovně jako argumenty cílového příkazu.
Předávání argumentů obsahujících znaky uvozovek
Některé nativní příkazy očekávají argumenty, které obsahují znaky uvozovek. Za normálních okolností analýza příkazového řádku PowerShellu odebere zadaný znak uvozovky. Analyzované argumenty se pak spojí do jednoho řetězce s každým parametrem odděleným mezerou. Tento řetězec je pak přiřazen k Argument vlastnost objektu ProcessStartInfo . Uvozovky v řetězci musí být uvozovky uvozovky nebo zpětné lomítko (\) znaky.
Poznámka:
Znak zpětného lomítka (\) není prostředím PowerShell rozpoznán jako řídicí znak. Jedná se o řídicí znak používaný základním rozhraním API pro ProcessStartInfo.Argumentsrozhraní .
Další informace o požadavcích na řídicí příkaz naleznete v dokumentaci pro ProcessStartInfo.Arguments.
Následující příklady použití TestExe.exe tohoto nástroje. Tento nástroj používají testy Pester ve zdrojovém úložišti PowerShell. Cílem těchto příkladů je předat cestu "C:\Program Files (x86)\Microsoft\" k adresáři nativnímu příkazu, aby přijala cestu jako řetězec v uvozováku.
Parametr zobrazuje hodnoty přijaté jako argumenty spustitelnému souboru. Tento nástroj můžete použít k ověření, že jste správně uchyceli znaky v argumentech.
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 --% """C:\Program Files (x86)\Microsoft\\""
TestExe -echoargs --% """%ProgramFiles(x86)%\Microsoft\\""
Výstup je stejný pro všechny příklady:
Arg 0 is <"C:\Program Files (x86)\Microsoft\">
Můžete vytvořit TestExe ze zdrojového kódu. Viz TestExe.
Předávání argumentů příkazům PowerShellu
Počínaje PowerShellem 3.0 můžete pomocí koncového parametru tokenu (--) zastavit interpretaci vstupu v PowerShellu jako parametry PowerShellu. Toto je konvence zadaná ve specifikaci prostředí POSIX a nástrojů.
Token konce parametrů (--) označuje, že všechny argumenty, za kterými následuje, mají být předány ve skutečné podobě, jako by se kolem nich umístily dvojité uvozovky. Například pomocí -- můžete zobrazit řetězec -InputObject bez použití uvozovek a bez interpretace jako parametru:
Write-Output -- -InputObject
-InputObject
Na rozdíl od tokenu stop-parsing (--%) je možné všechny hodnoty následující za tokenem -- interpretovat jako výrazy pomocí PowerShellu.
Write-Output -- -InputObject $env:PROCESSOR_ARCHITECTURE
-InputObject
AMD64
Toto chování platí jenom pro příkazy PowerShellu. Pokud při volání externího příkazu použijete token --, předá se -- řetězec jako argument pro tento příkaz.
TestExe -echoargs -a -b -- -c
Výstup ukazuje, že -- je předán jako argument do TestExe.
Arg 0 is <-a>
Arg 1 is <-b>
Arg 2 is <-->
Arg 3 is <-c>