2. Struktura leksyktyczna

2.1 Gramatyki

Ta specyfikacja przedstawia składnię języka programu PowerShell z użyciem dwóch gramatyk. Gramatyka leksyktyczna ();B.1) pokazuje, jak znaki Unicode są łączone w celu formowania terminatorów linii, komentarzy, białych znaków i tokenów. Gramatyka składniowa ();B.2) pokazuje, jak tokeny wynikające z gramatyki leksykatycznej są łączone w celu formowania skryptów programu PowerShell.

Dla wygody fragmenty tych gramatyk są replikowane w odpowiednich miejscach w całej tej specyfikacji.

W przypadku używania znaków od "a" do "z" w gramatykach jest bez uwzględniania liter. Oznacza to, że litera 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 zmiennych preferencji.

2.2 Analiza leksyktyczna

2.2.1 Skrypty

Składnia:

Porada

Notacja ~opt~ w definicjach składni wskazuje, że jednostka leksyktyczna 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 programu 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ę wejściami analizy składniowej.

Skrypt to grupa poleceń programu PowerShell przechowywanych w pliku script-file. Sam skrypt nie ma nazwy per se i pobiera swoją nazwę 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 następuje po podpisie, ani do czegokolwiek, co wygląda jak podpis. Ta specyfikacja nie obejmuje tworzenia i używania podpisów cyfrowych.

2.2.2 Terminatory liniowe

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ść znaków nowego wiersza w strumieniu wejściowym źródła dzieli go na wiersze, których można użyć do takich czynności jak raportowanie błędów i wykrywanie końca komentarza jedno wierszowego.

Terminator wiersza może być traktowany jako biały odstęp (";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:

Kod źródłowy można dodać adnotacje, korzystając z komentarzy.

Komentarz jedno wierszowy rozpoczyna się od znaku i # kończy się znakiem nowego wiersza.

Komentarz z ogranicznikami rozpoczyna się od pary znaków i <# kończy się parą znaków #>. Może występować jako część wiersza źródłowego, jako cały wiersz źródłowy lub może obejmować dowolną liczbę wierszy źródłowych.

Komentarz jest traktowany jako biały obszar.

Powyższe produkcja implikują, że

  • Komentarze nie są zagnieżdżane.
  • Sekwencje znaków <# i #> nie mają specjalnego znaczenia w komentarzu jedno wierszowym.
  • Znak # nie ma specjalnego znaczenia w komentarzu z ogranicznikami.

Gramatyka leksyktyczna implikuje, że komentarze nie mogą występować wewnątrz tokenów.

(Aby uzyskać informacje na temat tworzenia plików skryptów zawierających komentarze o specjalnych wartościach, które są używane do generowania dokumentacji na podstawie plików skryptów, zobacz .A).

Wymaga komentarz określa kryteria, które muszą być spełnione, aby jego zawierający skrypt można było uruchomić. Podstawowym kryterium jest wersja programu PowerShell używana do uruchamiania skryptu. Wymagania dotyczące minimalnej wersji są określone w następujący sposób:

#requires -Version N[.n]

Gdzie N to (wymagana) wersja główna, a n to (opcjonalnie) wersja pomocnicza.

Wymaga komentarz może być obecny w dowolnym pliku skryptu; Jednak nie może być obecny wewnątrz funkcji ani polecenia cmdlet. Musi to być pierwszy element w wierszu źródłowym. Skrypt może zawierać wiele komentarzy wymaga.

Sekwencja znaków jest rozpoznawana jako komentarz tylko wtedy, gdy ta sekwencja rozpoczyna się od # lub <#. Na przykład hello#jest traktowany jako pojedynczy token, natomiast #there jest traktowana jako token hello, po którym następuje komentarz jedno wierszowy. Sekwencja uruchamiania komentarza może być poprzedzona dowolnym znakiem kończącym wyrażenie lub kończącym instrukcje ( )takim jak , }, ], ', "lub ;).

Komentarz wymaga nie może być obecny wewnątrz przystawki.

Istnieją cztery inne formy komentarza wymagającego komentarza:

#requires --Assembly AssemblyId
#requires --Module ModuleName
#requires --PsSnapIn PsSnapIn [ -Version *N* [.n] ]
#requires --ShellId ShellId

2.2.4 Białe miejsce

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:

Biały znak składa się z dowolnej sekwencji jednego lub większej liczby białych znaków .

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, program PowerShell nie uznaje znaków wiersza-terminatora ();2.2.2) za biały znak. Jednak terminator wiersza może być traktowany jako biały znak odstępu, poprzedzając go natychmiast znakiem backtick ` (U+0060). Jest to konieczne, gdy zawartość wiersza jest kompletna syntaktycznie, ale następujący wiersz zawiera tokeny, które mają być skojarzone 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 cofka wskazuje, że linia źródłowa jest kontynuowana. Poniższe wyrażenie jest równoważne wyrażeniu $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 leksykacznym w języku programu PowerShell.

Tokeny mogą być oddzielone znakami nowego wiersza, komentarzami, białymi znakami lub dowolną ich kombinacją.

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, gdy jest używane w miejscu zależnym od kontekstu. Najczęściej jest to pierwszy token w instrukcji . Istnieją jednak inne lokalizacje wskazywane przez gramatykę. (Token, który wygląda jak słowo kluczowe, ale nie jest używany w kontekście słowa kluczowego, jest nazwą polecenia lub argumentem polecenia).

Słowa kluczowe class, define, from, usingi są var zarezerwowane do użytku w przyszłości.

Uwaga

Uwaga edytora: Słowa class kluczowe i using zostały wprowadzone w programie PowerShell 5.0. Zobacz about_Classes i about_Using.

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 tece (%).5). Zmienna $? został omówiony [w programie ]2.3.2.2]§2.3.2.2. Zakresy omówiono w programie .3.5.

Zmienne i są $$ zarezerwowane $^ do użytku w środowisku interaktywnym, które jest poza zakresem tej specyfikacji.

Istnieją dwa sposoby na napisanie nazwy zmiennej: nazwa zmiennej w nawiasach klamrowych ,$ która rozpoczyna się od ciągu , po której następuje zestaw nawiasów klamrowych z co najmniej jednym niemal dowolnym znakiem, oraz zwykła nazwa zmiennej,$ która również zaczyna się od ciągu , po którym następuje zestaw znaków z bardziej restrykcyjnego zestawu niż pozwala nazwa zmiennej nawiasów klamrowych. Każdą nazwę zwykłej zmiennej można wyrazić przy użyciu odpowiedniej nazwy zmiennej w nawiasach klamrowych.

$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 litera nie jest odrębna .

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). Wszystkie mogą 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 na raz. Jednak zestaw argumentów może być przekazywany jako grupa z rozszerzeniem na poszczególne argumenty obsługiwane przez środowisko uruchomieniowe. Automatyczne rozszerzanie argumentów jest nazywane splatting. 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. Tej notacji można używać tylko w argumentze polecenia.

Nazwy są podzielone na partycje w różnych przestrzeniach nazw, z których każda jest przechowywana na dysku wirtualnym (";3.1). Na przykład zmienne są przechowywane w , Variable:zmienne Env:``Function:środowiskowe są przechowywane w , funkcje są przechowywane w u użytkownikach , a aliasy są przechowywane w .Alias: Wszystkie te nazwy są dostępne jako zmienne przy użyciu produkcji przestrzeni nazw zmiennych w zakresie zmiennej. 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ą Variable: przestrzenią nazw jest równoznaczne z użyciem tej samej nazwy zmiennej bez tej kwalifikacji. Na przykład i $v$Variable:v wymienne.

Zmienne, oprócz definicji w języku, można także zdefiniować za pomocą polecenia cmdlet New-Variable.

2.3.2.1 Zmienne zdefiniowane przez użytkownika

Każda nazwa zmiennej dozwolona przez gramatykę, ale nie jest używana przez zmienne automatyczne lub zmienne 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

Automatyczne zmienne przechowują informacje o stanie środowiska programu PowerShell. Ich wartości mogą być odczytywane w skrypcie napisanym przez użytkownika, ale nie są zapisywane.

Uwaga

Tabela pierwotnie znaleziona w tym dokumencie została usunięta w celu ograniczenia 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 inicjowanie przez środowisko uruchomieniowe programu PowerShell. Ich wartości można odczytywać i zapisywać w skrypcie napisanym przez użytkownika.

Uwaga

Tabela pierwotnie znaleziona w tym dokumencie została usunięta w celu ograniczenia 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 informacje mogą być przekazywane do niego za pośrednictwem co najmniej jednego argumentu, którego wartości są dostępne z poziomu polecenia za pośrednictwem 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 , gdzie first-parameter-char i parameter-chars razem tworzą nazwę przełącznika, która odpowiada nazwie parametru ( -bez jego wiodącej ) w wywoływanym poleceniu. Jeśli dwukropek na końcowej stronie zostanie pominięty, obecność tego argumentu wskazuje, że odpowiedni parametr ma być ustawiony na $true. Jeśli jest obecny dwukropek na końcowej trasie, argument bezpośrednio po musi wyznaczyć wartość typu bool, a odpowiedni parametr jest ustawiany na 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ć parametru polecenia , w którym parametry first-parameter-char i parameter-chars razem tworzą nazwę parametru, która odpowiada nazwie parametru (bez jego wiodącego parametru -) w wywoływanym poleceniu. Nie może być dwukropka końcowego. Argument bezpośrednio po nim wyznacza skojarzoną wartość. Na przykład w przypadku polecenia Get-Power, które ma parametry i $base $exponent, następujące wywołania są równoważne:

    Get-Power -base 5 -exponent 3
    Get-Power -exponent 3 -base 5
    
  • Argument pozycyjne ();8.10.2) — argumenty i odpowiadające im parametry wewnątrz poleceń mają pozycje z pierwszą pozycją o wartości zero. Argument na pozycji 0 jest powiązany z parametrem na pozycji 0; argument na pozycji 1 jest powiązany z parametrem na pozycji 1; i tak dalej. Na przykład w przypadku polecenia Get-Power, które $base $exponent ma parametry i odpowiednio w pozycjach 0 i 1, następujące polecenie wywołuje następujące polecenie:

    Get-Power 5 3
    

Aby uzyskać szczegółowe informacje o parametrach specjalnych -- i , zobacz . --%8.2

Po wywołaniu polecenia nazwa parametru może być skrócona. można użyć dowolnej odrębnej wiodącej części pełnej nazwy, pod warunkiem, że jest ona jednoznaczna w odniesieniu do nazw innych parametrów zaakceptowanych przez to samo polecenie.

Aby uzyskać informacje na temat powiązania 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 numeryczne

Istnieją dwa rodzaje literałów liczbowych: liczba całkowita (";2.3.5.1.1) i rzeczywista (";2.3.5.1.2). Oba mogą mieć sufiksy mnożenia (";2.3.5.1.3).

2.3.5.1.1 Literały całkowite

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 na podstawie jego wartości, obecności lub braku sufiksu typu długiego oraz obecności mnożnika liczbowego (";2.3.5.1.3).

Literał liczby całkowitej bez sufiksu typu długiego

  • 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 long ();4.2.3), jest to jego typ.
  • W przeciwnym razie, jeśli jej wartość może być reprezentowana przez typ decimal ();2.3.5.1.2), jest to jego typ.
  • W przeciwnym razie jest reprezentowany przez typ double (";2.3.5.1.2).

Literał liczby całkowitej z sufiksem typu długiego

  • Jeśli jej wartość może być reprezentowana przez typ long (";4.2.3), jest to jego typ;
  • W przeciwnym razie ten literał nie jest formowany.

W reprezentacji liczby całkowitej uzupełniania dwóch wartości istnieje jeszcze jedna wartość ujemna niż dodatnia. Dla typu int dodatkowa wartość to -2147483648. W przypadku typu długiego dodatkowa wartość to -9223372036854775808. Mimo że token 2147483648 zwykle traktowany jako literał typu długiego, jeśli jest poprzedzony bezpośrednio przez operator unary - , ten operator i literał są traktowane jako literał typu int z najmniejszą wartością. Podobnie, mimo że token 9223372036854775808 jest zwykle traktowany jako rzeczywisty literał typu dziesiętnego, jeśli jest bezpośrednio poprzedzony operatorem unary - , ten operator i literał są traktowane jako literał typu, który długo ma najmniejszą wartość.

Niektóre przykłady literałów liczb całkowitych to 123 (int), 123L (long) i 20000000000 (long).

Nie ma czegoś takiego jak literał liczby całkowitej typu bajt.

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:

Literał rzeczywisty może zawierać multiplikator liczbowy (";2.3.5.1.3).

Istnieją dwa rodzaje literału rzeczywistego: podwójne i dziesiętne. Są one wskazywane przez brak lub obecność odpowiednio sufiksu typu dziesiętnego. (Nie ma czegoś takiego jak literał rzeczywisty zmiennoprzecinkowy).

Podwójny literał rzeczywisty ma typ double (";4.2.4.1). Literał liczby rzeczywistej dziesiętnej ma typ decimal (";4.2.4.2). Końcowe zera w części ułamkowej dziesiętnego literału rzeczywistego są znaczące.

Jeśli wartość cyfr dziesiętnych części wykładnika w podwójnym literału rzeczywistym jest mniejsza niż minimalna obsługiwana wartość tego podwójnego literału rzeczywistego wynosi 0. Jeśli wartość cyfr dziesiętnych części wykładnika w rzeczywistym literałze dziesiętnym jest mniejsza niż minimalna obsługiwana wartość, ten literał nie jest formowany. Jeśli wartość cyfr dziesiętnych wykładnika w podwójnym lub dziesiętnym literałze rzeczywistym jest większa niż maksymalna obsługiwana wartość, ten literał nie jest formowany.

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 (ze skalą 0), 1,20d (ze skalą 2), 1,23450e1d (tj. 12,3450 ze skalą 4), 1,2345e3d (tj. 1234,5 ze skalą 1), 1,2345e-1d (tj. 0,12345 ze skalą 5) i 1,2345e-3d (tj. 0,0012345 ze skalą 7).

Uwaga

Ponieważ podwójny literał rzeczywisty nie musi mieć części ułamkowej ani wykładnika, nawiasy grupujące w (123). M są potrzebne, aby upewnić się, że właściwość lub metoda M jest wybierana dla obiektu w postaci liczby całkowitej, którego wartość to 123. Bez tych nawiasów rzeczywisty literał byłby źle uformowany.

Uwaga

Mimo że program PowerShell nie zapewnia literałów dla literałów i nan, podwójne rzeczywiste odpowiedniki podobne do literałów 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 zezwala na to, co zaczyna się jako podwójny literał rzeczywisty, na sufiks l typu lub L . Taki token jest tak naprawdę literałem liczby całkowitej, którego wartość jest reprezentowana przez typ long.

Uwaga

Ta funkcja została zachowana w celu zachowania zgodności z poprzednimi wersjami programu PowerShell. Nie jest jednak zalecane, aby programiści używali literałów całkowitych tej formy, ponieważ mogą łatwo zasłaniać 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 których żaden nie jest od razu oczywisty.

2.3.5.1.3 Sufiksy multipliera

Składnia:

numeric-multiplier: *one of*
    kb mb gb tb pb

Opis:

Dla wygody liczby całkowite i literały rzeczywiste mogą zawierać multiplikator liczbowy , który wskazuje jeden z zestawu często używanych potęg liczby 10. Multiplier liczbowy można zapisywać w dowolnej kombinacji wielkich lub małych liter.

Mnożnik Znaczenie Przykład
Kb kilobajt (1024) 1 kb ≡ 1024
Mb megabajt (1024 x 1024) 1,30 MB ≡ 1363148.80
Gb gigabyte (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 ciągu:

  • literał-ciągu dosłownego (jedno wierszowy pojedynczy cudzysłów), który jest sekwencją zera lub większej liczby znaków rozdzielonych parą znaków pojedynczego cudzysłowu. Przykłady to "" i "red".

  • expandable-string-literal (jedno wierszowy podwójny cudzysłów), który jest sekwencją zera lub większej liczby znaków rozdzielonych przez parę znaków podwójnego cudzysłowu. Przykłady to "" i "red".

  • literał-ciągu dosłownego-tutaj-ciągu (wielo wierszowy w pojedynczym cudzysłowie), który jest sekwencją zera lub większej liczby znaków rozdzielonych przez pary znaków @znak-pojedynczego cudzysłowu i znak-pojedynczego cudzysłowu@, wszystkie zawarte w co najmniej dwóch wierszach źródłowych. Oto przykłady:

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • expandable-here-string-literal (podwójny cudzysłów wielo wierszowy), który jest sekwencją zera lub większej liczby znaków rozdzielonych przez pary znaków @znak-podwójnego cudzysłowu i znak-podwójnego cudzysłowu@, wszystkie zawarte odpowiednio w co najmniej dwóch wierszach źródłowych. Oto przykłady:

    @"
    "@
    
    @"
    line 1
    "@
    
    @"
    line 1
    line 2
    "@
    

W przypadku literałów ciągu dosłownego i literałów ciągu z możliwością rozwijania-tutaj-ciągu, z wyjątkiem odstępu (który jest ignorowany) w tym samym wierszu źródłowym co para znaków ogranicznika otwierającego nie mogą być poprzedzane znaki w tym samym wierszu źródłowym co zamykająca para znaków ogranicznika.

Treść literału ciągu dosłownego lub rozwijanego-tutaj-ciągu 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 rozdzielania literału ciągu dosłownego lub literału ciągu rozszerzonego może być zawarty w takim literału ciągu, pisząc ten znak dwa razy po kolei. Na przykład 'What''s the time?' i "I said, ""Hello"".". Jednak pojedynczy znak cudzysłowu nie ma specjalnego znaczenia wewnątrz literału typu expandable-string-literał*, a znak* podwójnego cudzysłowu nie ma specjalnego znaczenia wewnątrz literału ciągu dosłownego.

Literał-ciągu-rozwijania i literał-ciągu z możliwością rozwijania w tym miejscu mogą zawierać znaki ucieczki (";2.3.7). Na przykład gdy następujący literał ciągu jest zapisywany w potoku, wynik jest następujący:

"column1`tcolumn2`nsecond line, `"Hello`", ```Q`5`!"
column1<horizontal-tab>column2<new-line>
second line, "Hello", `Q5!

Jeśli literał-ciągu-rozwijania lub rozwijalny-tutaj-ciąg-literał zawiera nazwę zmiennej, chyba że ta nazwa jest poprzedzona znakiem ucieczki, jest zastępowana ciągiem reprezentowanym przez wartość tej zmiennej (";6.7). Jest to nazywane podstawianiem zmiennych.

Uwaga

Jeśli nazwa zmiennej jest częścią większego wyrażenia, zamieniana jest tylko nazwa zmiennej. Na przykład jeśli jest tablicą $a zawierającą elementy 100 i 200, ">$a.Length<" >100 200.Length< wynik jest wartością , a ">$($a.Length)<" wynik to >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 rozwinięcie literału ciągu

The value of $count is 10.

Rozważ następujące źródła:

$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

Literały ciągów rozszerzalnych i rozwijanych tutaj-ciągów obsługują również rodzaj podstawienia nazywane rozszerzeniem wyrażenia podrzędnego, $( ... ) traktując tekst formularza jako wyrażenie podrzędne (";7.1.6). Taki tekst jest zastępowany ciągiem reprezentowania wartości tego wyrażenia (";6,8). Wszelkie białe znaki używane do oddzielania tokenów na liście instrukcji wyrażenia podrzędnego są ignorowane, jeśli chodzi o konstrukcję ciągu wynikowego.

Przykłady:

$count = 10
"$count + 5 is $($count + 5)"
"$count + 5 is `$($count + 5)"
"$count + 5 is `$(`$count + 5)"

Wynik w następujący sposób rozwijany ciąg literałów:

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 )"

Powoduje to następujące rozszerzenie literału ciągu:

$i, $j, and $k have the values 5 10 15

Te cztery wiersze mogły zostać napisane zwięźlej 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 rozwijalny literał-ciągu 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 mające zarówno podstawienie zmiennej, jak i rozszerzenie wyrażenia podrzędnego. Należy również zauważyć, że ograniczniki wewnętrznego literału rozszerzalnych ciągów nie muszą być znakami ucieczki; Fakt, że znajdują się one w wyrażeniu podrzędnym, oznacza, że nie mogą być terminatorami dla zewnętrznego literału ciągu rozszerzanego.

Literał-ciągu-rozszerzanego lub rozwijany-tutaj-ciąg-literał zawierający podstawienie zmiennej lub rozszerzenie wyrażenia podrzędnego jest obliczany za każdym razem, gdy jest używany ten literał. na przykład

$a = 10
$s1 = "`$a = $($a; ++$a)"
"`$s1 = >$s1<"
$s2 = "`$a = $($a; ++$a)"
"`$s2 = >$s2<"
$s2 = $s1
"`$s2 = >$s2<"

Co powoduje następujące rozwijalne literały ciągu:

$s1 = >$a = 10<
$s2 = >$a = 11<
$s2 = >$a = 10<

Zawartość literału ciągu dosłownego-tutaj-ciągu jest dosłowna, w tym wszystkie wiodące lub końcowe białe spacje w treści. W związku z tym osadzone znaki pojedynczego cudzysłowu nie muszą być podwojone i nie ma podstawiania ani rozszerzania. Na przykład

$lit = @'
That's it!
2 * 3 = $(2*3)
'@

co powoduje literał

That's it!
2 * 3 = $(2*3)

Zawartość literału ciągu z możliwością rozwijania w tym miejscu jest podstawianiem i rozszerzaniem, ale wszystkie wiodące lub końcowe białe znaki w treści, ale poza dowolnymi wyrażeniami podrzędnymi, są dosłowne, a osadzone znaki podwójnego cudzysłowu nie muszą być podwojone. Na przykład

$lit = @"
That's it!
2 * 3 = $(2*3)
"@

Co powoduje następujący literał po rozwinięciu:

That's it!
2 * 3 = 6

Zarówno w przypadku literałów ciągu dosłownego, jak i rozwijalnych literałów ciągu w tym miejscu, każdy terminator wiersza w treści jest reprezentowany w wynikowym literałze w sposób zdefiniowany w implementacji. Na przykład w przeglądarce

$lit = @"
abc
xyz
"@

Drugi wiersz treści ma dwie wiodące spacje, a pierwszy i drugi wiersz treści mają terminatory wierszy; Jednak terminator drugiego wiersza treści nie jest częścią tej treści. Wynikowy literał jest odpowiednikiem: "abc<implementation-defined character sequence>xyz".

Uwaga

Aby pomóc w czytelności źródła, długie literały ciągu można podzielić na wiele wierszy źródłowych bez wstawienia terminatorów wierszy. Odbywa się to przez zapisywanie każdej części jako oddzielnego literału i dzielenie części za pomocą operatora + (";7.7.2). Ten operator umożliwia operandom wyznaczanie dowolnego z czterech rodzajów literału ciągu.

Uwaga

Chociaż nie ma czegoś takiego jak literał znaku per se, ten sam efekt można osiągnąć, korzystając z pierwszego znaku w ciągu 1-znakowym w następujący sposób: [char]"A" lub "A"[0].

Zarówno w przypadku literałów ciągu dosłownego, jak i rozwijanego-tutaj-ciągu, każdy terminator wiersza w treści jest reprezentowany dokładnie tak, jak podano.

2.3.5.3 Literał o wartości null

Zobacz zmienną automatyczną $null (";2.3.2.2).

2.3.5.4 Literały logiczne

Zobacz zmienne automatyczne i $false $true (";2.3.2.2).

2.3.5.5 Literały tablicy

Program PowerShell umożliwia tworzenie wyrażeń typu tablicy (%).9) przy użyciu operatora przecinka dwuargowego (";7.2.1), wyrażenia tablicy (";7.1.7), operatora przecinka binarnego (";7.3) i operatora zakresu (%).7.4).

2.3.5.6 Literały skrótu

Program PowerShell umożliwia napisanie wyrażeń typu Tablica skrótów (10) przy użyciu wyrażenia-literału-skrótu ([]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 interpunku

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.

Uwaga

Uwaga edytora: operatory łańcucha potoków && i || zostały wprowadzone w programie PowerShell 7. Zobacz about_Pipeline_Chain_Operators.

Nazwa po łączniku w operatorze jest zarezerwowana do tego celu tylko w kontekście operatora.

Operator, który rozpoczyna się od kreski, nie może zawierać odstępu między tym łącznikiem a tokenem, który po nim następuje.

2.3.7 Znaki ucieczki

Składnia:

escaped-character:
    ` (The backtick character U+0060) followed by any Unicode character

Opis:

Znak ucieczki to sposób przypisywania specjalnej interpretacji do znaku przez nadanie mu prefiksu Znak backtick (U+0060). W poniższej tabeli przedstawiono znaczenie każdego znaku ucieczki:

Znak ucieczki Znaczenie
`a Alert (U+0007)
`b Backspace (U+0008)
`f Źródło danych formularza (U+000C)
`n Nowy wiersz (U+000A)
`r Powrót karetki (U+000D)
`t Karta pozioma (U+0009)
`v Karta pionowa (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ż te, które pokazano powyżej, znak backtick x jest ignorowany i jest ignorowany dosłownie.

Implikacja końcowego wpisu w powyższej tabeli jest taka, że spacje, które w przeciwnym razie byłyby oddzielone tokenami, mogą być częścią tokenu. Na przykład nazwę pliku zawierającą spację można zapisywać jako Test` Data.txt (oraz lub 'Test Data.txt' "Test Data.txt").