2. Struktura leksykalna
Notatka redakcyjna
Ważny
Specyfikacja języka Windows PowerShell 3.0 została opublikowana w grudniu 2012 r. i jest oparta na Windows PowerShell 3.0. Ta specyfikacja nie odzwierciedla bieżącego stanu programu PowerShell. Nie ma planu aktualizacji tej dokumentacji w celu odzwierciedlenia bieżącego stanu. Ta dokumentacja jest przedstawiona tutaj w celu uzyskania informacji historycznych.
Dokument specyfikacji jest dostępny jako dokument programu Microsoft Word z Centrum pobierania Microsoft pod adresem: https://www.microsoft.com/download/details.aspx?id=36389 Dokument programu Word został przekonwertowany na prezentację tutaj w witrynie Microsoft Learn. Podczas konwersji wprowadzono pewne zmiany redakcyjne w celu dostosowania formatowania dla platformy Docs. Usunięto niektóre literówki i drobne błędy.
2.1 Gramatyki
Ta specyfikacja przedstawia składnię języka programu PowerShell przy użyciu dwóch gramatyki. gramatyka leksykalna (§B.1) pokazuje, jak znaki Unicode są łączone w zakończenia wierszy, komentarze, białe znaki i tokeny. W gramatyce składniowej (§B.2) pokazano, jak tokeny wynikające z gramatyki leksykalnej są łączone do tworzenia skryptów PowerShell.
Dla wygody fragmenty tych gramatyki są replikowane w odpowiednich miejscach w tej specyfikacji.
Wszelkie użycie znaków "a" do "z" w gramatyce jest bez brania pod uwagę wielkości liter. Oznacza to, że wielkość liter w zmiennych, aliasach, nazwach funkcji, słowach kluczowych, instrukcjach i operatorach jest ignorowana. Jednak w całej tej specyfikacji takie nazwy są zapisywane małymi literami, z wyjątkiem niektórych zmiennych automatycznych i preferencji.
2.2 Analiza leksykalna
2.2.1 Skrypty
Składnia:
Napiwek
Notacja ~opt~
w definicjach składni wskazuje, że jednostka leksykalna jest opcjonalna w składni.
input:
input-elements~opt~ signature-block~opt~
input-elements:
input-element
input-elements input-element
input-element:
whitespace
comment
token
signature-block:
signature-begin signature signature-end
signature-begin:
new-line-character # SIG # Begin signature block new-line-character
signature:
base64 encoded signature blob in multiple single-line-comments
signature-end:
new-line-character # SIG # End signature block new-line-character
Opis:
Strumień źródłowy danych wejściowych do translatora PowerShell to dane wejściowe w skrypcie, który zawiera sekwencję znaków Unicode. Przetwarzanie leksykalne tego strumienia obejmuje zmniejszenie tych znaków do sekwencji tokenów, które stają się danymi wejściowymi analizy składniowej.
Skrypt to grupa poleceń programu PowerShell przechowywanych w plik-skrypt. Sam skrypt nie ma nazwy samo w sobie i jego nazwa pochodzi z pliku źródłowego. Koniec tego pliku wskazuje koniec skryptu.
Skrypt może opcjonalnie zawierać podpis cyfrowy. Środowisko hosta nie jest wymagane do przetwarzania żadnego tekstu, który znajduje się za podpisem ani niczego, co wygląda jak podpis. Tworzenie i używanie podpisów cyfrowych nie jest objęte tą specyfikacją.
2.2.2 Znak końca wiersza
Składnia:
new-line-character:
Carriage return character (U+000D)
Line feed character (U+000A)
Carriage return character (U+000D) followed by line feed character (U+000A)
new-lines:
new-line-character
new-lines new-line-character
Opis:
Obecność nowego znaku wierszaw strumieniu źródłowym danych wejściowych dzieli ją na wiersze, których można użyć do takich elementów, jak raportowanie błędów i wykrywanie końca komentarza jednowierszowego.
Terminator wiersza może być traktowany jako biały znak (§2.2.4).
2.2.3 Komentarze
Składnia:
comment:
single-line-comment
requires-comment
delimited-comment
single-line-comment:
# input-characters~opt~
input-characters:
input-character
input-characters input-character
input-character:
Any Unicode character except a new-line-character
requires-comment:
#requires whitespace command-arguments
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
dashdash:
dash dash
delimited-comment:
< # delimited-comment-text~opt~ hashes >
delimited-comment-text:
delimited-comment-section
delimited-comment-text delimited-comment-section
delimited-comment-section:
>
hashes~opt~ not-greater-than-or-hash
hashes:
#
hashes #
not-greater-than-or-hash:
Any Unicode character except > or #
Opis:
Można opatrzyć kod źródłowy adnotacjami, używając komentarzy .
jednowierszowy
komentarz rozdzielany zaczyna się od pary znaków <#
i kończy się parą znaków #>
.
Może występować jako część linii źródłowej, jako cała linia źródłowa lub może obejmować dowolną liczbę linii źródłowych.
Komentarz jest traktowany jako biały znak.
Powyższe produkcje oznaczają, że
- Komentarze nie są zagnieżdżone.
- Sekwencje znaków <# i #> nie mają specjalnego znaczenia w komentarzu jednowierszowym.
- Znak # nie ma specjalnego znaczenia w rozdzielonym komentarzu.
Gramatyka leksykalna oznacza, że komentarze nie mogą występować wewnątrz tokenów.
(Zobacz §A, aby uzyskać informacje o tworzeniu plików skryptów zawierających specjalne komentarze używane do generowania dokumentacji na podstawie plików skryptów).
wymaga komentarza określa kryteria, które muszą zostać spełnione, aby można było uruchomić zawierający skrypt. Podstawowym kryterium jest wersja programu PowerShell używana do uruchamiania skryptu. Minimalne wymaganie dotyczące wersji jest określane w następujący sposób:
#requires -Version N[.n]
Gdzie N to (wymagana) wersja główna, a n to (opcjonalna) wersja pomocnicza.
wymaga komentarza może być obecny w dowolnym pliku skryptu; jednak nie może być obecny wewnątrz funkcji lub polecenia cmdlet. Musi to być pierwszy element w wierszu źródłowym. Skrypt może zawierać wiele wymaga komentarzas.
Sekwencja znaków jest rozpoznawana tylko jako komentarz, jeśli sekwencja rozpoczyna się od #
lub <#
. Na przykład, hello#there jest traktowane jako pojedynczy token, podczas gdy hello #there jest traktowane jako token hello, po którym następuje komentarz jednowierszowy. Oprócz następujących białych znaków sekwencja rozpoczęcia komentarza może być również poprzedzona dowolnym znakiem zakończenia wyrażenia lub kończeniem instrukcji (na przykład )
, }
, ]
, '
, "
lub ;
).
wymaga komentarza nie może być obecny wewnątrz przystawki.
Istnieją cztery inne formy wymaga komentarza:
#requires --Assembly AssemblyId
#requires --Module ModuleName
#requires --PsSnapIn PsSnapIn [ -Version *N* [.n] ]
#requires --ShellId ShellId
2.2.4 Białe znaki
Składnia:
whitespace:
Any character with Unicode class Zs, Zl, or Zp
Horizontal tab character (U+0009)
Vertical tab character (U+000B)
Form feed character (U+000C)
` (The backtick character U+0060) followed by new-line-character
Opis:
Znak odstępu składa się z dowolnej sekwencji co najmniej jednego znaku odstępu.
Z wyjątkiem faktu, że biały znak może działać jako separator tokenów, jest ignorowany.
W przeciwieństwie do niektórych popularnych języków, PowerShell nie traktuje znaków końca linii (§2.2.2) jako znaki białe. Jednak terminator wiersza może być traktowany jako biała spacja, jeśli natychmiast poprzedzi go znak backtick, `
(U+0060). Jest to konieczne, gdy zawartość wiersza jest kompletna składniowo, ale następujący wiersz zawiera tokeny przeznaczone do skojarzenia z poprzednim wierszem. Na przykład
$number = 10 # assigns 10 to $number; nothing is written to the pipeline
+ 20 # writes 20 to the pipeline
- 50 # writes -50 to the pipeline
$number # writes $number's value, 10, to the pipeline
W tym przykładzie znak tyldy (`) wskazuje, że linia źródłowa jest kontynuowana. Następujące wyrażenie jest równoważne $number = 10 + 20 - 50
.
$number = 10 `
+ 20 `
- 50
$number # writes $number's value to the pipeline
-20
2.3 Tokeny
Składnia:
token:
keyword
variable
command
command-parameter
command-argument-token
integer-literal
real-literal
string-literal
type-literal
operator-or-punctuator
Opis:
Token jest najmniejszym elementem leksykalnym w języku programu PowerShell.
Tokeny mogą być oddzielone nowych wierszy, komentarzy, białych znaków lub dowolnej kombinacji.
2.3.1 Słowa kluczowe
Składnia:
keyword: one of
begin break catch class
continue data define do
dynamicparam else elseif end
exit filter finally for
foreach from function if
in inlinescript parallel param
process return switch throw
trap try until using
var while workflow
Opis:
Słowo kluczowe to sekwencja znaków, która ma specjalne znaczenie w przypadku użycia w miejscu zależnym od kontekstu. Najczęściej jest to pierwszy token w instrukcji ; istnieją jednak inne lokalizacje, zgodnie z gramatyką. (Token, który wygląda jak słowo kluczowe, ale nie jest używany w kontekście słowa kluczowego, jest nazwa-polecenia lub argument-polecenia.)
Słowa kluczowe class
, define
, from
, using
i var
są zarezerwowane do użytku w przyszłości.
Notatka
Uwaga edytora: słowa kluczowe class
i using
zostały wprowadzone w programie PowerShell 5.0. Zobacz o_Klasach i o_Używaniu.
2.3.2 Zmienne
Składnia:
variable:
$$
$?
$^
$ variable-scope~opt~ variable-characters
@ variable-scope~opt~ variable-characters
braced-variable
braced-variable:
${ variable-scope~opt~ braced-variable-characters }
variable-scope:
global:
local:
private:
script:
using:
workflow:
variable-namespace
variable-namespace:
variable-characters :
variable-characters:
variable-character
variable-characters variable-character
variable-character:
A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
_ (The underscore character U+005F)
?
braced-variable-characters:
braced-variable-character
braced-variable-characters braced-variable-character
braced-variable-character:
Any Unicode character except
} (The closing curly brace character U+007D)
` (The backtick character U+0060)
escaped-character
escaped-character:
` (The backtick character U+0060) followed by any Unicode character
Opis:
Zmienne zostały szczegółowo omówione w temacie (§5). Zmienna $? omówiono w §2.3.2.2. Zakresy omówiono w §3.5.
Zmienne $$
i $^
są zarezerwowane do użycia w środowisku interaktywnym, które wykracza poza zakres tej specyfikacji.
Istnieją dwa sposoby pisania nazwy zmiennej: nazwa zmiennej w nawiasach klamrowych, która zaczyna się od $
, po którym następuje zestaw jednego lub więcej niemal dowolnych znaków ograniczonych nawiasem klamrowym; oraz zwykła nazwa zmiennej, która również zaczyna się od $
, a następnie zestaw jednego lub więcej znaków z bardziej ograniczonego zestawu niż w nazwie zmiennej w nawiasach klamrowych. Każda zwykła nazwa zmiennej może być wyrażona przy użyciu odpowiedniej nazwy zmiennej nawiasu klamrowego.
$totalCost
$Maximum_Count_26
$végösszeg # Hungarian
$итог # Russian
$総計 # Japanese (Kanji)
${Maximum_Count_26}
${Name with`twhite space and `{punctuation`}}
${E:\\File.txt}
Nie ma żadnego limitu długości nazwy zmiennej, wszystkie znaki w nazwie zmiennej są znaczące, a wielkość liter nie jest unikatowa.
Istnieje kilka różnych rodzajów zmiennych: zdefiniowane przez użytkownika (§2.3.2.1), automatyczne (§2.3.2.2) i preferencje (§2.3.2.3). Mogą one współistnieć w tym samym zakresie (§3.5).
Rozważmy następującą definicję funkcji i wywołania:
function Get-Power ([long]$base, [int]$exponent) { ... }
Get-Power 5 3 # $base is 5, $exponent is 3
Get-Power -exponent 3 -base 5 # " " "
Każdy argument jest przekazywany według pozycji lub nazwy, po jednym naraz. Można jednak przekazać zestaw argumentów jako grupę z rozszerzeniem do poszczególnych argumentów obsługiwanych przez środowisko uruchomieniowe. To automatyczne rozszerzanie argumentów jest nazywane splattingiem. Na przykład
$values = 5,3 # put arguments into an array
Get-Power @values
$hash = @{ exponent = 3; base = 5 } # put arguments into a Hashtable
Get-Power @hash
function Get-Power2 { Get-Power @args } # arguments are in an array
Get-Power2 --exponent 3 --base 5 # named arguments splatted named in
@args
Get-Power2 5 3 # position arguments splatted positionally in @args
Jest to osiągane przy użyciu @
zamiast $
jako pierwszego znaku przekazywanej zmiennej.
Ta notacja może być używana tylko w argumencie polecenia.
Nazwy są podzielone na różne przestrzenie nazw, z których każda jest przechowywana na dysku wirtualnym (§3.1). Na przykład zmienne są przechowywane w Variable:
, zmienne środowiskowe są przechowywane w Env:
, funkcje są przechowywane w Function:
, a aliasy są przechowywane w Alias:
. Dostęp do wszystkich tych nazw można uzyskać jako zmienne przy pomocy przestrzeni nazw zmiennych w produkcji w zakresie zmiennych . Na przykład
function F { "Hello from F" }
$Function:F # invokes function F
Set-Alias A F
$Alias:A # invokes function F via A
$Count = 10
$Variable:Count # accesses variable Count
$Env:Path # accesses environment variable Path
Każde użycie nazwy zmiennej z jawną przestrzenią nazw Variable:
jest równoważne użyciu tej samej nazwy zmiennej bez tego kwalifikatora. Na przykład $v
i $Variable:v
są wymienne.
Oprócz definiowania w języku zmienne można również zdefiniować za pomocą polecenia cmdlet new-variable.
2.3.2.1 Zmienne zdefiniowane przez użytkownika
Dowolna nazwa zmiennej dozwolona przez gramatykę, ale nie jest używana przez zmienne automatyczne lub preferencji, jest dostępna dla zmiennych zdefiniowanych przez użytkownika.
Zmienne zdefiniowane przez użytkownika są tworzone i zarządzane przez skrypt zdefiniowany przez użytkownika.
2.3.2.2 Zmienne automatyczne
Zmienne automatyczne przechowują informacje o stanie środowiska programu PowerShell. Ich wartości mogą być odczytywane w skrycie napisanym przez użytkownika, ale nie są zapisywane.
Notatka
Tabela pierwotnie znaleziona w tym dokumencie została usunięta w celu zmniejszenia duplikacji. Aby uzyskać pełną listę zmiennych automatycznych, zobacz about_Automatic_Variables.
2.3.2.3 Zmienne preferencji
Zmienne preferencji przechowują preferencje użytkownika dla sesji. Są one tworzone i inicjowane przez środowisko uruchomieniowe programu PowerShell. Wartości te można odczytywać i zapisywać w skryptach napisanych przez użytkownika.
Notatka
Tabela pierwotnie znaleziona w tym dokumencie została usunięta w celu zmniejszenia duplikacji. Aby uzyskać pełną listę zmiennych preferencji, zobacz about_Preference_Variables.
2.3.3 Polecenia
Składnia:
generic-token:
generic-token-parts
generic-token-parts:
generic-token-part
generic-token-parts generic-token-part
generic-token-part:
expandable-string-literal
verbatim-here-string-literal
variable
generic-token-char
generic-token-char:
Any Unicode character except
{ } ( ) ; , | & $
` (The backtick character U+0060)
double-quote-character
single-quote-character
whitespace
new-line-character
escaped-character
generic-token-with-subexpr-start:
generic-token-parts $(
2.3.4 Parametry
Składnia:
command-parameter:
dash first-parameter-char parameter-chars colon~opt~
first-parameter-char:
A Unicode character of classes Lu, Ll, Lt, Lm, or Lo
_ (The underscore character U+005F)
?
parameter-chars:
parameter-char
parameter-chars parameter-char
parameter-char:
Any Unicode character except
{ } ( ) ; , \| & . [
colon
whitespace
new-line-character
colon:
: (The colon character U+003A)
verbatim-command-argument-chars:
verbatim-command-argument-part
verbatim-command-argument-chars verbatim-command-argument-part
verbatim-command-argument-part:
verbatim-command-string
& non-ampersand-character
Any Unicode character except
|
new-line-character
non-ampersand-character:
Any Unicode character except &
verbatim-command-string:
double-quote-character non-double-quote-chars
double-quote-character
non-double-quote-chars:
non-double-quote-char
non-double-quote-chars non-double-quote-char
non-double-quote-char:
Any Unicode character except
double-quote-character
Opis:
Po wywołaniu polecenia można przekazać do niego informacje za pośrednictwem co najmniej jednego argumentu, którego wartości są dostępne wewnątrz polecenia za pomocą zestawu odpowiednich parametrów . Proces dopasowywania parametrów do argumentów jest nazywany powiązaniem parametrów .
Istnieją trzy rodzaje argumentów:
Parametr przełącznika (§8.10.5) — ma postać parametru polecenia, w którym first-parameter-char i parametr-chars tworzą nazwę przełącznika, która odpowiada nazwie parametru (bez wiodącej
-
) w wywoływanym poleceniu. Jeśli pominięto dwukropek końcowy, obecność tego argumentu wskazuje, że odpowiedni parametr ma być ustawiony na$true
. Jeśli końcowy dwukropek jest obecny, to argument bezpośrednio po nim musi określać wartość typu bool, a odpowiedni parametr jest ustawiany na tę wartość. Na przykład następujące wywołania są równoważne:Set-MyProcess -Strict Set-MyProcess -Strict: $true
Parametr z argumentem (§8.10.2) — ma postać parametr polecenia, gdzie pierwszy-znak-parametru i znaki-parametru razem tworzą nazwę parametru, która odpowiada nazwie parametru (bez jego wiodącego znaku minus) w wywoływanym poleceniu. Nie może być żadnego końcowego dwukropka. Argument bezpośrednio następujący określa skojarzoną wartość. Na przykład przy użyciu polecenia
Get-Power
, które ma parametry$base
i$exponent
, następujące wywołania są równoważne:Get-Power -base 5 -exponent 3 Get-Power -exponent 3 -base 5
Argument pozycyjny (§8.10.2) — argumenty i odpowiadające im parametry w poleceniach mają pozycje, z pierwszą mającą pozycję zero. Argument w pozycji 0 jest powiązany z parametrem w pozycji 0; argument w pozycji 1 jest powiązany z parametrem w pozycji 1; i tak dalej. Na przykład, biorąc pod uwagę polecenie
Get-Power
, które ma parametry$base
i$exponent
umieszczone odpowiednio na pozycjach 0 i 1, można wywołać to polecenie w następujący sposób:Get-Power 5 3
Zobacz §8.2, aby uzyskać szczegółowe informacje na temat specjalnych parametrów --
i --%
.
Po wywołaniu polecenia można skrócić nazwę parametru; można użyć odrębnej części wiodącej pełnej nazwy, pod warunkiem że jest jednoznaczna w odniesieniu do nazw innych parametrów akceptowanych przez to samo polecenie.
Aby uzyskać informacje o powiązaniu parametrów, zobacz §8.14.
2.3.5 Literały
Składnia:
literal:
integer-literal
real-literal
string-literal
2.3.5.1 Literały liczbowe
Istnieją dwa rodzaje literałów liczbowych: liczba całkowita (§2.3.5.1.1) i rzeczywiste (§2.3.5.1.2). Oba mogą mieć sufiksy mnożnika (§2.3.5.1.3).
2.3.5.1.1 Literały liczb całkowitych
Składnia:
integer-literal:
decimal-integer-literal
hexadecimal-integer-literal
decimal-integer-literal:
decimal-digits numeric-type-suffix~opt~ numeric-multiplier~opt~
decimal-digits:
decimal-digit
decimal-digit decimal-digits
decimal-digit: one of
0 1 2 3 4 5 6 7 8 9
numeric-type-suffix:
long-type-suffix
decimal-type-suffix
hexadecimal-integer-literal:
0x hexadecimal-digits long-type-suffix~opt~
numeric-multiplier~opt~
hexadecimal-digits:
hexadecimal-digit
hexadecimal-digit decimal-digits
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f
long-type-suffix:
l
numeric-multiplier: one of
kb mb gb tb pb
Opis:
Typ literału liczby całkowitej jest określany przez jego wartość, obecność lub brak sufiksu typu long oraz obecność mnożnika liczbowego (§2.3.5.1.3).
W przypadku literału liczby całkowitej bez sufiksu długiego typu
- Jeśli jego wartość może być reprezentowana przez typ int (§4.2.3), jest to jego typ;
- W przeciwnym razie, jeśli jego wartość może być reprezentowana przez typ długi (§4.2.3), jest to jego typ.
- W przeciwnym razie, jeśli jego wartość może być reprezentowana przez typ dziesiętny (§2.3.5.1.2), jest to jego typ.
- W przeciwnym razie jest reprezentowany przez typ podwójny (§2.3.5.1.2).
W przypadku literału liczby całkowitej z sufiksem typu długiego
- Jeśli jego wartość może być reprezentowana przez typ długi (§4.2.3), jest to jego typ;
- W przeciwnym razie taki literał jest niepoprawnie utworzony.
W reprezentacji dwuspełniawcowej wartości całkowitych istnieje jeszcze jedna wartość ujemna niż dodatnia. Dla typu int ta dodatkowa wartość to -2147483648. W przypadku typu długiego dodatkowa wartość to -9223372036854775808. Mimo że token 2147483648 zwykle będzie traktowany jako literał typu long, jeśli jest poprzedzony bezpośrednio jednoargumentowym operatorem -, operator ten i literał są traktowane jako literał typu int o najmniejszej wartości. Podobnie, mimo że token 9223372036854775808 zwykle będzie traktowany jako literał liczby rzeczywistej typu dziesiętnego, jeśli jest on bezpośrednio poprzedzony jednoargumentowym operatorem '-', operator ten i literał są traktowane jako literał typu long o najmniejszej wartości.
Niektóre przykłady literałów liczb całkowitych to 123 (int), 123L (long) i 200000000000 (long).
Nie ma czegoś takiego jak literał całkowity typu byte.
2.3.5.1.2 Literały rzeczywiste
Składnia:
real-literal:
decimal-digits . decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
. decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
decimal-digits exponent-part decimal-type-suffix~opt~ numeric-multiplier~opt~
exponent-part:
e sign~opt~ decimal-digits
sign: one of
+
dash
decimal-type-suffix:
d
l
numeric-multiplier: one of
kb mb gb tb pb
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Opis:
Prawdziwy literał może zawierać mnożnik liczbowy (§2.3.5.1.3).
Istnieją dwa rodzaje literału rzeczywistego: podwójne i dziesiętne. Wskazywane są one odpowiednio przez brak lub obecność sufiksu typu dziesiętnego. (Nie ma czegoś takiego jak zmiennoprzecinkowy literał rzeczywisty.)
Podwójny literał rzeczywisty ma typ podwójny (§4.2.4.1). Literał rzeczywisty dziesiętny ma typ dziesiętny (§4.2.4.2). Końcowe zera w części ułamkowej literału rzeczywistego dziesiętnego są znaczące.
Jeśli wartość części wykładniczejcyfr dziesiętnych w podwójnym literału rzeczywistego jest mniejsza niż wartość minimalna obsługiwana, wartość tego podwójnego literału rzeczywistego wynosi 0. Jeśli wartość części wykładniczejcyfr dziesiętnych w literale rzeczywistym dziesiętnym jest mniejsza niż minimalna obsługiwana wartość literału, to literał jest źle sformułowany. Jeśli wartość części wykładniczejcyfr dziesiętnych w podwójnym lub dziesiętnym literale rzeczywistym jest większa niż maksymalna obsługiwana wartość literału, to literał jest źle sformułowany.
Niektóre przykłady podwójnych literałów rzeczywistych to 1., 1.23, .45e35, 32.e+12 i 123.456E-231.
Niektóre przykłady literałów rzeczywistych dziesiętnych to 1d (skala 0), 1,20d (skala 2), 1,23450e1d (tj. 12,3450, która ma skalę 4), 1,2345e3d (tj. 1234,5, która ma skalę 1), 1,2345e-1d (tj. 0,12345, która ma skalę 5) i 1,2345e-3d (tj. 0,0,0012345, która ma skalę 7).
Notatka
Ponieważ podwójny literał rzeczywisty nie musi mieć części ułamkowej ani wykładniczej, nawiasy grupowania w (123).M są potrzebne, aby upewnić się, że właściwość lub metoda M jest wybierana dla obiektu typu całkowitego, którego wartość to 123. Bez tych nawiasów właściwy literał byłby błędnie sformułowany.
Notatka
Mimo że program PowerShell nie udostępnia literałów dla nieskończoności i NaNs, odpowiedniki odpowiadające literałom podwójnym można uzyskać ze statycznych właściwości tylko do odczytu PositiveInfinity, NegativeInfinity i NaN typów float i double (§4.2.4.1).
Gramatyka pozwala, aby podwójny literał rzeczywisty miał sufiks typu l
lub L
. Taki token jest w istocie literałem całkowitym, którego wartość jest reprezentowana przez typ long.
Notatka
Ta funkcja została zachowana w celu zapewnienia zgodności z poprzednimi wersjami programu PowerShell. Nie zaleca się, aby programiści używali literałów liczb całkowitych tego formatu, ponieważ mogą one łatwo zasłonić rzeczywistą wartość literału. Na przykład 1,2L ma wartość 1, 1,2345e1L ma wartość 12, a 1,2345e-5L ma wartość 0, z czego żadna nie jest natychmiast oczywista.
2.3.5.1.3 Sufiksy mnożnika
Składnia:
numeric-multiplier: *one of*
kb mb gb tb pb
Opis:
Dla wygody literały całkowite i rzeczywiste mogą zawierać mnożnik cyfrowy, który wskazuje jedną z powszechnie używanych potęg 10. mnożnik liczbowy można zapisać w dowolnej kombinacji małych lub wielkich liter.
mnożnika | znaczenie | Przykład |
---|---|---|
Baza wiedzy | kilobajt (1024) | 1 kb ≡ 1024 |
mb | megabajt (1024 x 1024) | 1.30Dmb ≡ 1363148.80 |
gb | gigabajt (1024 x 1024 x 1024) | 0x10Gb ≡ 17179869184 |
Tb | terabajt (1024 x 1024 x 1024 x 1024) | 1,4e23 tb ≡ 1,5393162788864E+35 |
Pb | petabajt (1024 x 1024 x 1024 x 1024 x 1024) | 0x12Lpb ≡ 20266198323167232 |
2.3.5.2 Literały ciągu
Składnia:
string-literal:
expandable-string-literal
expandable-here-string-literal
verbatim-string-literal
verbatim-here-string-literal
expandable-string-literal:
double-quote-character expandable-string-characters~opt~ dollars~opt~ double-quote-character
double-quote-character:
" (U+0022)
Left double quotation mark (U+201C)
Right double quotation mark (U+201D)
Double low-9 quotation mark (U+201E)
expandable-string-characters:
expandable-string-part
expandable-string-characters
expandable-string-part
expandable-string-part:
Any Unicode character except
$
double-quote-character
` (The backtick character U+0060)
braced-variable
$ Any Unicode character except
(
{
double-quote-character
` (The backtick character U+0060)*
$ escaped-character
escaped-character
double-quote-character double-quote-character
dollars:
$
dollars $
expandable-here-string-literal:
@ double-quote-character whitespace~opt~ new-line-character
expandable-here-string-characters~opt~ new-line-character double-quote-character @
expandable-here-string-characters:
expandable-here-string-part
expandable-here-string-characters expandable-here-string-part
expandable-here-string-part:
Any Unicode character except
$
new-line-character
braced-variable
$ Any Unicode character except
(
new-line-character
$ new-line-character Any Unicode character except double-quote-char
$ new-line-character double-quote-char Any Unicode character except @
new-line-character Any Unicode character except double-quote-char
new-line-character double-quote-char Any Unicode character except @
expandable-string-with-subexpr-start:
double-quote-character expandable-string-chars~opt~ $(
expandable-string-with-subexpr-end:
double-quote-char
expandable-here-string-with-subexpr-start:
@ double-quote-character whitespace~opt~ new-line-character expandable-here-string-chars~opt~ $(
expandable-here-string-with-subexpr-end:
new-line-character double-quote-character @
verbatim-string-literal:
single-quote-character verbatim-string-characters~opt~ single-quote-char
single-quote-character:
' (U+0027)
Left single quotation mark (U+2018)
Right single quotation mark (U+2019)
Single low-9 quotation mark (U+201A)
Single high-reversed-9 quotation mark (U+201B)
verbatim-string-characters:
verbatim-string-part
verbatim-string-characters verbatim-string-part
verbatim-string-part:
*Any Unicode character except* single-quote-character
single-quote-character single-quote-character
verbatim-here-string-literal:
@ single-quote-character whitespace~opt~ new-line-character
verbatim-here-string-characters~opt~ new-line-character
single-quote-character *@*
verbatim-*here-string-characters:
verbatim-here-string-part
verbatim-here-string-characters verbatim-here-string-part
verbatim-here-string-part:
Any Unicode character except* new-line-character
new-line-character Any Unicode character except single-quote-character
new-line-character single-quote-character Any Unicode character except @
Opis:
Istnieją cztery rodzaje literałów tekstowych.
dosłowny literał stringowy (jednolinijny w pojedynczych cudzysłowach), który jest sekwencją zera lub więcej znaków, ograniczoną parą znaków pojedynczego cudzysłowu. Przykłady to "" i "czerwony".
rozszerzalny literał łańcucha (jednoliniowy w podwójnych cudzysłowach), który jest sekwencją zera lub większej liczby znaków rozdzielonych przez parę znaków podwójnego cudzysłowu. Przykłady to "" i "czerwony".
literał-tu-ciąg-znaków (jednoliniowy ciąg znaków z wieloma liniami), który jest sekwencją zerowej liczby lub więcej znaków ograniczoną parami znaków @pojedynczy-cudzysłów oraz pojedynczy-cudzysłów@, odpowiednio, wszystkie znajdujące się na dwóch lub więcej liniach źródłowych. Przykłady to:
@' '@ @' line 1 '@ @' line 1 line 2 '@
rozwijalny literał ciągu tutaj (wielowierszowy cudzysłów podwójny), który jest sekwencją zera lub więcej znaków rozdzielonych przez pary znaków @znak cudzysłowu oraz znak cudzysłowu@, odpowiednio, wszystkie zawarte w dwóch lub więcej wierszach źródłowych. Przykłady to:
@" "@ @" line 1 "@ @" line 1 line 2 "@
W przypadku literałów - here-docs i rozszerzalnych literałów - here-docs, z wyjątkiem białych znaków (które są ignorowane), w tym samym wierszu nie mogą się pojawić żadne znaki po parze otwierających znaków ogranicznika ani nie mogą niczego poprzedzać przed parą zamykających znaków ogranicznika.
Treść dosłownego literatu tutaj-łańcucha lub rozszerzalnego tutaj-łańcucha rozpoczyna się na początku pierwszego wiersza źródłowego po ograniczniku otwierającym i kończy się na końcu ostatniego wiersza źródłowego poprzedzającego ogranicznik zamykający. Treść może być pusta. Terminator wiersza w ostatnim wierszu źródłowym poprzedzającym ogranicznik zamykający nie jest częścią treści tego literału.
Literał dowolnego z tych rodzajów ma ciąg typu (§4.3.1).
Znak używany do rozdzielić literał-ciągu dosłownego lub rozszerzalny literał-ciągu może być zawarty w takim literału ciągu, pisząc ten znak dwa razy z rzędu. Na przykład 'What''s the time?'
i "I said, ""Hello""."
. Jednak pojedynczy znak cudzysłowu nie ma specjalnego znaczenia wewnątrz rozszerzalnego literału ciągu, a podwójny znak cudzysłowu nie ma specjalnego znaczenia wewnątrz literału ciągu dosłownego.
literał-ciągu rozszerzalnego i rozszerzalny-here-string-literal może zawierać znak-ucieczkis (§2.3.7). Na przykład, gdy poniższy literał ciągu zostanie zapisany w potoku, wynik jest przedstawiony jak pokazano poniżej.
"column1`tcolumn2`nsecond line, `"Hello`", ```Q`5`!"
column1<horizontal-tab>column2<new-line>
second line, "Hello", `Q5!
Jeśli rozszerzalny literał ciągu lub rozszerzalny literał here-string zawiera nazwę zmiennej, chyba że nazwa jest poprzedzona znakiem ucieczki, zostaje zastąpiona ciągiem reprezentującym wartość tej zmiennej (§6.7). Jest to nazywane podstawieniem zmiennych .
Notatka
Jeśli nazwa zmiennej jest częścią większego wyrażenia, zostanie zamieniona tylko nazwa zmiennej. Jeśli na przykład $a
jest tablicą zawierającą elementy 100 i 200, ">$a.Length<"
powoduje >100 200.Length<
, podczas gdy ">$($a.Length)<"
powoduje >2<
. Zobacz rozszerzenie wyrażenia podrzędnego poniżej.
Na przykład kod źródłowy
$count = 10
"The value of `$count is $count"
powoduje rozszerzalny literał ciągu
The value of $count is 10.
Rozważ następujące kwestie:
$a = "red","blue"
"`$a[0] is $a[0], `$a[0] is $($a[0])" # second [0] is taken literally
Wynik to
$a[0] is red blue[0], $a[0] is red
rozszerzalny literał ciągus i rozszerzalny-tutaj-literał-ciągus obsługują również rodzaj podstawienia o nazwie rozszerzenia pod wyrażeniem, traktując tekst formularza $( ... )
jako wyrażenie-podrzędne (§7.1.6). Taki tekst jest zastępowany przez ciąg reprezentujący wartość tego wyrażenia (§6.8). Wszelkie białe znaki używane do oddzielania tokenów w liście instrukcji wyrażenia podrzędnegow
Przykłady,
$count = 10
"$count + 5 is $($count + 5)"
"$count + 5 is `$($count + 5)"
"$count + 5 is `$(`$count + 5)"
wynik w następującym literał rozszerzalnego ciągu :
10 + 5 is 15
10 + 5 is $(10 + 5)
10 + 5 is $($count + 5)
Następujące źródło,
$i = 5; $j = 10; $k = 15
"`$i, `$j, and `$k have the values $( $i; $j; $k )"
rezultatem jest następujący literał ciągu z możliwością rozwinięcia :
$i, $j, and $k have the values 5 10 15
Te cztery wiersze mogły zostać napisane bardziej zwięźle w następujący sposób:
"`$i, `$j, and `$k have the values $(($i = 5); ($j = 10); ($k = 15))"
W poniższym przykładzie:
"First 10 squares: $(for ($i = 1; $i -le 10; ++$i) { "$i $($i*$i) " })"
wynikowy literał ciągu rozwijalnego jest następujący:
First 10 squares: 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100
Jak pokazano, wyrażenie podrzędne może zawierać literały ciągu, które mają zarówno podstawianie zmiennych, jak i rozszerzanie wyrażeń podrzędnych. Należy również pamiętać, że wewnętrzne rozszerzalne literał-ciąguograniczniki nie muszą być uniknięci; fakt, że znajdują się wewnątrz wyrażenia podrzędnego oznacza, że nie mogą one być terminatorami dla zewnętrznego rozszerzalnego literału ciągu.
rozszerzalny literał ciągu lub rozszerzalny literał tutaj-ciągu, zawierający podstawienie zmiennej lub rozwinięcie podwyrażenia, jest oceniany za każdym razem, gdy literał jest używany; na przykład
$a = 10
$s1 = "`$a = $($a; ++$a)"
"`$s1 = >$s1<"
$s2 = "`$a = $($a; ++$a)"
"`$s2 = >$s2<"
$s2 = $s1
"`$s2 = >$s2<"
w wyniku powstaje następujący rozszerzalny literał łańcuchas:
$s1 = >$a = 10<
$s2 = >$a = 11<
$s2 = >$a = 10<
Zawartość dosłownego literału ciągu o jest przyjmowana dosłownie, łącznie z wszelkimi wiodącymi lub końcowymi białymi znakami zawartymi w treści. W związku z tym osadzone znaki pojedynczego cudzysłowu nie muszą być podwajane i nie ma zamiany ani rozszerzania. Na przykład
$lit = @'
That's it!
2 * 3 = $(2*3)
'@
który daje w wyniku literał
That's it!
2 * 3 = $(2*3)
Zawartość rozszerzalnego tutaj-literału ciągu podlega podstawieniu i rozszerzeniu, ale wszelkie wiodące lub końcowe białe spacje w treści, znajdujące się poza jakimikolwiek podrzędnymi wyrażeniamis, są traktowane dosłownie, a osadzone znaki podwójnego cudzysłowunie muszą być zdublowane. Na przykład
$lit = @"
That's it!
2 * 3 = $(2*3)
"@
w wyniku następującego literału po rozwinięciu:
That's it!
2 * 3 = 6
W przypadku zarówno literału 'here string', jak i rozszerzalnego literału 'here string', każdy terminator wiersza w treści jest reprezentowany w literał wynikowy w sposób zdefiniowany przez implementację. Na przykład w pliku
$lit = @"
abc
xyz
"@
druga linia treści ma dwie spacje wiodące, a pierwsza i druga linia treści mają znaki końcowe linii; jednakże, terminator drugiej linii treści to , a nie, będące częścią tej treści. Literał wynikowy jest odpowiednikiem: "abc<implementation-defined character sequence>xyz"
.
Notatka
Aby ułatwić czytelność źródła, długie literały tekstowe mogą być przerywane w wielu wierszach źródłowych bez wstawiania znaczników końca linii. Odbywa się to przez zapisanie każdej części jako osobnego literału, a następnie połączenie tych części za pomocą operatora + (§7.7.2). Ten operator umożliwia swoim operandom wyznaczenie dowolnego z czterech rodzajów literału ciągu.
Notatka
Chociaż nie ma czegoś takiego jak literał znaku jako taki, ten sam efekt można osiągnąć, korzystając z pierwszego znaku w ciągu składającym się z 1 znaku, w następujący sposób: [char]"A"
lub "A"[0]
.
W przypadku zarówno literał-here-strings, jak i rozszerzalny-here-strings, każdy znacznik końca linii w treści jest reprezentowany dokładnie tak, jak podano.
2.3.5.3 Literał null
Zobacz zmienną automatyczną $null
(§2.3.2.2).
2.3.5.4 Literały logiczne
Zobacz zmienne automatyczne $false
i $true
(§2.3.2.2).
2.3.5.5 Literały tablicy
Program PowerShell umożliwia zapisywanie wyrażeń typu tablicy (§9) przy użyciu operatora jednoargumentowego przecinka (
2.3.5.6 Literały haszowe
Program PowerShell pozwala na pisanie wyrażeń typu Hashtable (§10) przy użyciu literału skrótowego (§7.1.9)
2.3.5.7 Nazwy typów
Składnia:
type-name:
type-identifier
type-name . type-identifier
type-identifier:
type-characters
type-characters:
type-character
type-characters type-character
type-character:
A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
_ (The underscore character U+005F)
array-type-name:
type-name [
generic-type-name:
type-name [
2.3.6 Operatory i znaki interpunkcyjne
Składnia:
operator-or-punctuator: one of
{ } [ ] ( ) @( @{ $( ;
&& || & | , ++ .. :: .
! * / % + - --
-and -band -bnot -bor
-bxor -not -or -xor
assignment-operator
merging-redirection-operator
file-redirection-operator
comparison-operator
format-operator
assignment-operator: one of
= -= += *= /= %=
file-redirection-operator: one of
> >> 2> 2>> 3> 3>> 4> 4>>
5> 5>> 6> 6>> *> *>> <
merging-redirection-operator: one of
*>&1 2>&1 3>&1 4>&1 5>&1 6>&1
*>&2 1>&2 3>&2 4>&2 5>&2 6>&2
comparison-operator: *one of
-as -ccontains -ceq
-cge -cgt -cle
-clike -clt -cmatch
-cne -cnotcontains -cnotlike
-cnotmatch -contains -creplace
-csplit -eq -ge
-gt -icontains -ieq
-ige -igt -ile
-ilike -ilt -imatch
-in -ine -inotcontains
-inotlike -inotmatch -ireplace
-is -isnot -isplit
-join -le -like
-lt -match -ne
-notcontains -notin -notlike
-notmatch -replace -shl*
-shr -split
format-operator:
-f
Opis:
&&
i ||
są zarezerwowane do użytku w przyszłości.
Notatka
Uwaga edytora: operatory łańcucha potoków &&
i ||
zostały wprowadzone w programie PowerShell 7. Zobacz about_Pipeline_Chain_Operators.
Nazwa następująca kreska w operatorze jest zarezerwowana tylko w kontekście operatora.
Operator rozpoczynający się od kreski nie może mieć żadnego odstępu między tą kreską a tokenem, który następuje po nim.
2.3.7 Znaki ucieczki
Składnia:
escaped-character:
` (The backtick character U+0060) followed by any Unicode character
Opis:
znakiem ucieczki jest sposób przypisania specjalnej interpretacji do znaku, dając mu prefiks Backtick (U+0060). W poniższej tabeli przedstawiono znaczenie każdego znaku specjalnego:
Znak ucieczki | Znaczenie |
---|---|
`a |
Alarm (U+0007) |
`b |
Backspace (U+0008) |
`f |
Źródło danych formularzy (U+000C) |
`n |
Nowa linia (U+000A) |
`r |
Powrót karetki (U+000D) |
`t |
Tabulator poziomy (U+0009) |
`v |
Tabulator pionowy (U+0009) |
`' |
Pojedynczy cudzysłów (U+0027) |
`" |
Podwójny cudzysłów (U+0022) |
`` |
Backtick (U+0060) |
`0 |
NUL (U+0000) |
`x |
Jeśli x jest znakiem innym niż którykolwiek z wymienionych powyżej, znak odwrotnego apostrofu jest ignorowany, a x jest interpretowany dosłownie. |
Implikacją końcowego wpisu w powyższej tabeli jest to, że spacje, które w przeciwnym razie oddzielają tokeny, mogą stać się częścią tokenu. Na przykład nazwę pliku zawierającego spację można zapisać jako Test` Data.txt
(a także 'Test Data.txt'
lub "Test Data.txt"
).