Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Krótki opis
Opisuje sposób analizowania poleceń programu PowerShell.
Długi opis
Po wprowadzeniu polecenia w wierszu polecenia program PowerShell dzieli tekst polecenia na serię segmentów o nazwie tokenów, a następnie określa, jak interpretować każdy token.
Jeśli na przykład wpiszesz:
Write-Host book
Program PowerShell dzieli polecenie na dwa tokeny, Write-Host i book, i interpretuje każdy token niezależnie przy użyciu jednego z dwóch głównych trybów analizowania: trybu wyrażenia i trybu argumentu.
Uwaga / Notatka
Kiedy program PowerShell analizuje dane wejściowe polecenia, stara się przyporządkować nazwy poleceń do odpowiednich cmdletów lub natywnych plików wykonywalnych. Jeśli nazwa polecenia nie ma dokładnego dopasowania, program PowerShell dołącza Get- do polecenia jako czasownik domyślny. Na przykład program PowerShell analizuje Process jako Get-Process. Nie zaleca się używania tej funkcji z następujących powodów:
- To nieefektywne. Powoduje to wielokrotne wyszukiwanie w programie PowerShell.
- Programy zewnętrzne o tej samej nazwie są rozpoznawane jako pierwsze, więc nie można wykonać zamierzonego polecenia cmdlet.
-
Get-HelpiGet-Commandnie rozpoznają nazw bez czasowników.
Tryb wyrażeń
Tryb wyrażeń jest przeznaczony do łączenia wyrażeń wymaganych do manipulowania wartościami w języku skryptowym. Wyrażenia to reprezentacje wartości w składni programu PowerShell i mogą być proste lub złożone, na przykład:
Wyrażenia literalne są bezpośrednimi reprezentacjami ich wartości.
'hello'
32
Wyrażenia zmiennych przenoszą wartość zmiennej, do której się odwołują:
$x
$script:path
Operatory łączą inne wyrażenia do oceny:
-12
-not $Quiet
3 + 7
$input.Length -gt 1
- literały ciągu znaków muszą być zawarte w cudzysłowach.
- liczby są traktowane jako wartości liczbowe, a nie jako seria znaków (chyba że zostały one uniknione).
- Operatory , w tym operatory jednoargumentowe, takie jak
-i-not, oraz operatory binarne, takie jak+i-gt, są interpretowane jako operatory i stosują odpowiednie operacje na swoich argumentach (operandów). -
Wyrażenia atrybutów i konwersji są analizowane jako wyrażenia i stosowane do wyrażeń podrzędnych, np.
[int] '7'. - Odwołania do zmiennych są oceniane do ich wartości, ale splatting (tj. wklejanie wstępnie wypełnionych zestawów parametrów) jest zabronione i powoduje błąd parsera.
- Wszystko inne będzie traktowane jako polecenie do wywołania.
Tryb obsługi argumentów
Podczas analizowania program PowerShell najpierw analizuje dane wejściowe jako wyrażenie. Jednak po napotkaniu wywołania polecenia analizowanie będzie kontynuowane w trybie argumentowym. Jeśli masz argumenty zawierające spacje, takie jak ścieżki, należy ująć te wartości argumentów w cudzysłowie.
Tryb przetwarzania argumentów jest przeznaczony do analizowania argumentów i parametrów dla poleceń w środowisku powłokowym. Wszystkie dane wejściowe są traktowane jako ciąg rozszerzalny, chyba że używa jednej z następujących składni:
Znak dolara (
$), po którym następuje nazwa zmiennej, rozpoczyna odwołanie do zmiennej, w przeciwnym razie jest interpretowany jako część rozwijanego ciągu. Odwołanie do zmiennej może obejmować dostęp do składowych lub indeksowanie.- Dodatkowe znaki po prostych odwołaniach do zmiennych, takich jak
$HOME, są uważane za część tego samego argumentu. Dołącz nazwę zmiennej w nawiasach klamrowych ({}), aby oddzielić ją od kolejnych znaków. Na przykład${HOME}. - Gdy odwołanie do zmiennej obejmuje dostęp do elementu członkowskiego, pierwszy z dodatkowych znaków jest traktowany jako początek nowego argumentu. Na przykład
$HOME.Length-moreskutkuje dwoma argumentami: wartością$HOME.Lengthi ciągiem znaków-more.
- Dodatkowe znaki po prostych odwołaniach do zmiennych, takich jak
Znaki cudzysłowu (
'i") rozpoczynają ciągiNawiasy klamrowe (
{}) rozpoczynają nowe bloki skryptowePrzecinki (
,) wprowadzają listy przekazywane jako tablice, z wyjątkiem sytuacji, gdy polecenie, które ma być wywołane, jest aplikacją natywną, w którym to przypadku są one interpretowane jako część rozwijanego ciągu. Przecinki początkowe, kolejne lub końcowe nie są obsługiwane.Nawiasy (
()) rozpoczynają nowe wyrażenieOperator wyrażenia podrzędnego (
$()) rozpoczyna wyrażenie osadzonePoczątkowy znak (
@) rozpoczyna składnie wyrażeń, takie jak splatting (@args), tablice (@(1,2,3)) i literały tabeli skrótu (@{a=1;b=2}).(),$()i@()na początku tokenu tworzą nowy kontekst analizy, który może zawierać wyrażenia lub zagnieżdżone polecenia.- Po kolejnych znakach pierwszy dodatkowy znak jest traktowany jako początek nowego, oddzielnego argumentu.
- Gdy jest poprzedzony literałem
$()bez cudzysłowu, działa jak ciąg rozwijany, rozpoczyna nowy argument, który jest wyrażeniem,()i@()jest traktowany jako literał@z()rozpoczęciem nowego argumentu, który jest wyrażeniem.
Wszystkie inne elementy są traktowane jako ciąg rozszerzalny, z wyjątkiem metacharacters, które nadal wymagają ucieczki.
- Metacharactery trybu argumentu (znaki ze specjalnym znaczeniem składniowym) to:
<space> ' " ` , ; ( ) { } | & < > @ #. Spośród nich< > @ #są szczególne tylko na początku tokenu.
- Metacharactery trybu argumentu (znaki ze specjalnym znaczeniem składniowym) to:
Token zatrzymania analizowania (
--%) zmienia interpretację wszystkich pozostałych argumentów. Aby uzyskać więcej informacji, zobacz sekcję zatrzymywania analizowania tokenu poniżej.
Przykłady
Poniższa tabela zawiera kilka przykładów tokenów przetworzonych w trybie wyrażenia i trybie argumentu oraz ocenie tych tokenów. W tych przykładach wartość zmiennej $a jest 4.
| Przykład | Tryb | Wynik |
|---|---|---|
2 |
Wyrażenie | 2 (liczba całkowita) |
`2 |
Wyrażenie | "2" (polecenie) |
Write-Output 2 |
Wyrażenie | 2 (liczba całkowita) |
2+2 |
Wyrażenie | 4 (liczba całkowita) |
Write-Output 2+2 |
Argumentacja | "2+2" (ciąg) |
Write-Output(2+2) |
Wyrażenie | 4 (liczba całkowita) |
$a |
Wyrażenie | 4 (liczba całkowita) |
Write-Output $a |
Wyrażenie | 4 (liczba całkowita) |
$a+2 |
Wyrażenie | 6 (liczba całkowita) |
Write-Output $a+2 |
Argumentacja | "4+2" (ciąg) |
$- |
Argumentacja | "$-" (polecenie) |
Write-Output $- |
Argumentacja | "$-" (ciąg) |
a$a |
Wyrażenie | "a$a" (komenda) |
Write-Output a$a |
Argumentacja | "a4" (ciąg) |
a'$a' |
Wyrażenie | "a$a" (komenda) |
Write-Output a'$a' |
Argumentacja | "a$a" (ciąg) |
a"$a" |
Wyrażenie | "a$a" (komenda) |
Write-Output a"$a" |
Argumentacja | "a4" (ciąg) |
a$(2) |
Wyrażenie | "a$(2)" (polecenie) |
Write-Output a$(2) |
Argumentacja | "a2" (ciąg) |
Każdy token może być interpretowany jako jakiś rodzaj typu obiektu, taki jak wartość logiczna lub ciąg znaków . Program PowerShell próbuje określić typ obiektu z wyrażenia. Typ obiektu zależy od typu parametru oczekiwanego przez polecenie i od tego, czy program PowerShell wie, jak przekonwertować argument na poprawny typ. W poniższej tabeli przedstawiono kilka przykładów typów przypisanych do wartości zwracanych przez wyrażenia.
| Przykład | Tryb | Wynik |
|---|---|---|
Write-Output !1 |
argument | "!1" (ciąg) |
Write-Output (!1) |
wyrażenie | Fałsz (wartość logiczna) |
Write-Output (2) |
wyrażenie | 2 (liczba całkowita) |
Set-Variable AB A,B |
argument | "A","B" (tablica) |
CMD /CECHO A,B |
argument | "A,B" (ciąg) |
CMD /CECHO $AB |
wyrażenie | "A B" (tablica) |
CMD /CECHO :$AB |
argument | ':A B' (ciąg) |
Przekazywanie argumentów do poleceń natywnych
Podczas uruchamiania poleceń natywnych z programu PowerShell argumenty są najpierw analizowane przez program PowerShell. Przeanalizowane argumenty są następnie łączone w jeden ciąg z każdym parametrem oddzielonym spacją.
Na przykład następujące polecenie wywołuje program icacls.exe.
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Aby uruchomić to polecenie w programie PowerShell 2.0, należy użyć znaków ucieczki, aby zapobiec błędnej interpretacji nawiasów programu PowerShell.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
Token kończący analizę
Począwszy od programu PowerShell 3.0, możesz użyć tokenu zatrzymywania analizowania (--%), aby uniemożliwić programowi PowerShell interpretowanie danych wejściowych jako poleceń lub wyrażeń programu PowerShell.
Uwaga / Notatka
Token zatrzymywania analizowania jest przeznaczony tylko do użytku na platformach Windows.
Podczas wywoływania natywnego polecenia umieść znacznik zatrzymania analizy przed argumentami programu. Ta technika jest znacznie łatwiejsza niż używanie znaków ucieczki, aby zapobiec błędnej interpretacji.
W przypadku napotkania tokenu zatrzymania analizowania program PowerShell traktuje pozostałe znaki w wierszu jako literał. Jedyną interpretacją, którą wykonuje, jest zastąpienie wartości zmiennych środowiskowych korzystających ze standardowej notacji systemu Windows, takiej jak %USERPROFILE%.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
Program PowerShell wysyła następujący ciąg polecenia do programu icacls.exe:
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Token zatrzymania analizowania jest skuteczny tylko do momentu następnego nowego wiersza lub znaku potoku. Nie można użyć znaku kontynuacji (`), aby rozszerzyć jego efekt, ani użyć ogranicznika polecenia (;), aby zakończyć jego efekt.
Poza %variable% odwołaniami do zmiennych środowiskowych w poleceniu nie można osadzić żadnych innych elementów dynamicznych. Ucieczka % znaku jako %%, w sposób, w jaki można to zrobić w plikach wsadowych, nie jest obsługiwana.
%<name>% tokeny są niezmiennie rozwinięte. Jeśli <name> token nie odwołuje się do zdefiniowanej zmiennej środowiskowej, jest przekazywany przez as-is.
Nie można użyć przekierowania strumienia (takiego jak >file.txt), ponieważ są one przekazywane dosłownie jako argumenty do polecenia docelowego.
Przekazywanie argumentów zawierających znaki cudzysłowu
Niektóre natywne polecenia oczekują argumentów zawierających znaki cudzysłowu. Zwykle analizowanie wiersza polecenia programu PowerShell powoduje usunięcie podanego znaku cudzysłowu. Przeanalizowane argumenty są następnie łączone w jeden ciąg z każdym parametrem oddzielonym spacją. Ten ciąg jest następnie przypisywany do obiektu. Cudzysłowy w ciągu muszą być ucieczki przy użyciu dodatkowych cudzysłowów lub znaków ukośnika odwrotnego (\).
Uwaga / Notatka
Znak ukośnika odwrotnego (\) nie jest rozpoznawany jako znak ucieczki przez program PowerShell. Jest to znak ucieczki używany przez podstawowy interfejs API dla ProcessStartInfo.Arguments.
Aby uzyskać więcej informacji na temat wymagań ucieczki, zobacz dokumentację procesu ProcessStartInfo.Arguments.
Poniższe przykłady użycia TestExe.exe narzędzia. To narzędzie jest używane przez testy Pester w repozytorium źródłowym programu PowerShell. Celem tych przykładów jest przekazanie ścieżki "C:\Program Files (x86)\Microsoft\" katalogu do natywnego polecenia, tak aby otrzymał ścieżkę jako ciąg cytowany.
Parametr echoargsTestExe wyświetla wartości odebrane jako argumenty do pliku wykonywalnego. Za pomocą tego narzędzia można sprawdzić, czy znaki w argumentach zostały prawidłowo wymykane.
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\\""
Dane wyjściowe są takie same dla wszystkich przykładów:
Arg 0 is <"C:\Program Files (x86)\Microsoft\">
Możesz skompilować TestExe z kodu źródłowego. Zobacz TestExe.
Przekazywanie argumentów do poleceń programu PowerShell
Począwszy od programu PowerShell 3.0, możesz użyć tokenu end-of-parameters (--), aby uniemożliwić programowi PowerShell interpretowanie danych wejściowych jako parametrów programu PowerShell. Jest to konwencja określona w specyfikacji powłoki i narzędzi POSIX.
Token końca parametrów (--) wskazuje, że wszystkie argumenty po nim mają zostać przekazane w rzeczywistej formie, tak jakby cudzysłowy zostały umieszczone wokół nich. Na przykład przy użyciu -- można wyświetlić ciąg -InputObject bez użycia cudzysłowów lub interpretowania go jako parametru:
Write-Output -- -InputObject
-InputObject
W przeciwieństwie do tokenu stop-parsing (--%) wszystkie wartości następujące po tokenie -- można interpretować jako wyrażenia za pomocą programu PowerShell.
Write-Output -- -InputObject $env:PROCESSOR_ARCHITECTURE
-InputObject
AMD64
To zachowanie dotyczy tylko poleceń programu PowerShell. Jeśli używasz tokenu -- podczas wywoływania polecenia zewnętrznego, ciąg -- jest przekazywany jako argument do tego polecenia.
TestExe -echoargs -a -b -- -c
Dane wyjściowe pokazują, że -- jest przekazywany jako argument do TestExe.
Arg 0 is <-a>
Arg 1 is <-b>
Arg 2 is <-->
Arg 3 is <-c>