Udostępnij za pośrednictwem


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 zaczyna się od znaku i kończy się znakiem nowego wiersza.

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, usingi 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 nie są brane pod uwagę przy budowie 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ą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 (§7.2.1), wyrażenie-tablicy (Operator przecinka binarnego (§7.1.7) oraz operator zakresu (§7.4).

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