Sdílet prostřednictvím


2. Lexikální struktura

Redakční poznámka

Důležitý

specifikace jazyka Windows PowerShell 3.0 byla publikována v prosinci 2012 a je založená na prostředí Windows PowerShell 3.0. Tato specifikace neodráží aktuální stav PowerShellu. Tato dokumentace se neplánuje aktualizovat tak, aby odrážela aktuální stav. Tato dokumentace je zde uvedena pro historické reference.

Dokument specifikace je k dispozici jako dokument aplikace Microsoft Word z webu Microsoft Download Center na adrese: https://www.microsoft.com/download/details.aspx?id=36389 Dokument aplikace Word byl převeden pro prezentaci zde na webu Microsoft Learn. Během převodu byly provedeny některé redakční změny tak, aby vyhovovaly formátování pro platformu Docs. Některé překlepy a menší chyby byly opraveny.

2.1 Gramatiky

Tato specifikace zobrazuje syntaxi jazyka PowerShellu pomocí dvou gramatik. lexikální gramatika (§B.1) ukazuje, jak se znaky Unicode kombinují tak, aby vytvořily ukončovací čáry, komentáře, prázdné znaky a tokeny. syntaktická gramatika (§B.2) ukazuje, jak se tokeny, které jsou výsledkem lexikální gramatiky, kombinují k vytvoření skriptů PowerShellu.

Pro usnadnění jsou fragmenty této gramatiky opakovány na příslušných místech v rámci této specifikace.

Jakékoli použití znaků "a" až "z" v gramatických gramatikách nerozlišuje malá a velká písmena. To znamená, že písmena v proměnných, aliasech, názvech funkcí, klíčových slovech, příkazech a operátorech se ignorují. V této specifikaci jsou však tyto názvy napsané malými písmeny, s výjimkou některých automatických a předvolbových proměnných.

2.2 Lexikální analýza

2.2.1 Skripty

Syntax:

Spropitné

Zápis ~opt~ v definicích syntaxe označuje, že lexikální entita je v syntaxi nepovinná.

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

Popis:

Vstupní zdrojový stream do překladače PowerShellu je vstup a ve skriptu, který obsahuje posloupnost znaků Unicode. Lexikální zpracování tohoto datového proudu zahrnuje snížení těchto znaků do posloupnosti tokenů, které se stanou vstupem syntaktické analýzy.

Skript je skupina příkazů PowerShellu uložených v souboru skriptu. ** Samotný skript nemá žádný název a přebírá svůj název ze zdrojového souboru. Konec tohoto souboru označuje konec skriptu.

Skript může volitelně obsahovat digitální podpis. Hostitelské prostředí není nutné zpracovávat žádný text, který následuje za podpisem nebo cokoli, co vypadá jako podpis. Na vytváření a používání digitálních podpisů se tato specifikace nevztahuje.

2.2.2 Ukončovací čáry

Syntax:

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

Popis:

Přítomnost znak nového řádkus ve vstupním zdrojovém datovém proudu dělí ho na řádky, které lze použít například pro hlášení chyb a detekci konce jednořádkového komentáře.

Řádkový ukončovač lze považovat za prázdný znak (§2.2.4).

2.2.3 Komentáře

Syntax:

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 #

Popis:

Poznámky ve zdrojovém kódu mohou být přidány pomocí komentářů .

jednořádkový komentář začíná znakem # a končí znakem nového řádku .

s oddělovači začíná dvojicí znaků a končí párem znaků . Může nastat jako součást zdrojového řádku, jako celá zdrojová čára, nebo může zahrnovat libovolný počet zdrojových řádků.

Komentář se považuje za prázdné místo.

Výše uvedené produkce naznačují, že

  • Komentáře nelze vnořovat.
  • Sekvence znaků <# a #> nemají v jednom řádku žádný zvláštní význam.
  • Znak # nemá žádný zvláštní význam v ohraničeném komentáři.

Lexikální gramatika znamená, že komentáře nemohou nastat uvnitř tokenů.

(Informace viz §A ohledně vytváření skriptových souborů, které obsahují speciálně označené komentáře používané k vytváření dokumentace ze skriptových souborů.)

vyžaduje komentář k, který určuje kritéria, jež musí být splněna, aby byl umožněn běh skriptu, kterého je součástí. Primárním kritériem je verze PowerShellu, která se používá ke spuštění skriptu. Minimální požadavek na verzi je určen takto:

#Requires -Version N[.n]

Kde N je (povinná) hlavní verze a n je (volitelná) podverze.

vyžaduje-komentář může být přítomen v libovolném souboru skriptu; nemůže však být přítomen uvnitř funkce nebo cmdletu. Musí to být první položka na zdrojovém řádku. Skript může obsahovat více vyžaduje komentářs.

Sekvence znaků je rozpoznána pouze jako komentář, pokud tato sekvence začíná # nebo <#. Hello#se například považuje za jeden token, zatímco hello #there se považuje za token hello následovaný jedním řádkovým komentářem. Stejně jako po bílých znacích, může počáteční sekvenci komentáře také předcházet jakýkoli znak ukončení výrazu nebo příkazu (například ), }, ], ', "nebo ;).

Do modulu snap-in nemůže být vložen vyžadující komentář.

Existují čtyři další formy , které vyžadují komentář:

#Requires -Assembly AssemblyId
#Requires -Module ModuleName
#Requires -PSSnapin PSSnapin [ -Version *N* [.n] ]
#Requires -ShellId ShellId

2.2.4 Prázdné místo

Syntax:

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

Popis:

Mezery se skládají z libovolné sekvence jednoho nebo více prázdných znaků.

S výjimkou faktu, že prázdné znaky mohou fungovat jako oddělovač tokenů, jsou ignorovány.

Na rozdíl od některých oblíbených jazyků PowerShell nepovažuje za prázdné znaky ukončovací znaky (§2.2.2). Ukončovací znak řádku však může být považován za prázdný znak, pokud je bezprostředně předcházen znakem základní čárky, ` (U+0060). To je nezbytné, pokud je obsah řádku syntakticky dokončený, ale následující řádek obsahuje tokeny, které mají být přidruženy k předchozímu řádku. Například

$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

V tomto příkladu backtick označuje pokračování zdrojového řádku. Následující výraz je ekvivalentní $number = 10 + 20 - 50.

$number = 10 `
+ 20 `
- 50
$number # writes $number's value to the pipeline
-20

2.3 Tokeny

Syntax:

token:
    keyword
    variable
    command
    command-parameter
    command-argument-token
    integer-literal
    real-literal
    string-literal
    type-literal
    operator-or-punctuator

Popis:

Token je nejmenší lexikální prvek v jazyce PowerShellu.

Tokeny je možné oddělit novými řádky, komentáři, mezerami nebo jejich kombinací.

2.3.1 Klíčová slova

Syntax:

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

Popis:

Klíčové slovo je posloupnost znaků, která má zvláštní význam, když je použita na místě závislém na kontextu. Nejčastěji se jedná o první token v příkazu ; existují však další místa, jak je uvedeno gramatikou. (Token, který vypadá jako klíčové slovo, ale nepoužívá se v kontextu klíčového slova, je název příkazu nebo argument příkazu.)

Klíčová slova class, define, from, usinga var jsou vyhrazena pro budoucí použití.

Poznámka

Poznámka editoru: Klíčová slova class a using byla zavedena v PowerShellu 5.0. Viz o třídách a o používání.

2.3.2 Proměnné

Syntax:

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

Popis:

Proměnné jsou podrobně popsány v (§5). Proměnná $? je popsáno v §2.3.2.2. Rozsahy jsou popsány v §3.5.

Proměnné $$ a $^ jsou vyhrazené pro použití v interaktivním prostředí, které je mimo rozsah této specifikace.

Existují dva způsoby zápisu názvu proměnné: název uzavřený ve složených závorkách, který začíná $, následovaný sadou oddělenou složenými závorkami, která obsahuje jeden nebo více téměř libovolných znaků; a běžný název proměnné, který také začíná $, následovaný sadou jednoho nebo více znaků z více omezené sady než dovoluje název uzavřený ve složených závorkách. Každý běžný název proměnné lze vyjádřit pomocí odpovídajícího názvu složených proměnných.

$totalCost
$Maximum_Count_26

$végösszeg # Hungarian
$итог # Russian
$総計 # Japanese (Kanji)

${Maximum_Count_26}
${Name with`twhite space and `{punctuation`}}
${E:\\File.txt}

Délka názvu proměnné není nijak omezena, všechny znaky v názvu proměnné jsou významné a malá písmena nejsou odlišné.

Existují různé druhy proměnných: uživatelem definované (§ 2.3.2.1), automatické (§2.3.2.2.2) a preference (§2.3.2.3). Všechny mohou koexistovat ve stejném rozsahu (§3.5).

Zvažte následující definici funkce a volání:

function Get-Power ([long]$Base, [int]$Exponent) { ... }

Get-Power 5 3 # $Base is 5, $Exponent is 3
Get-Power -Exponent 3 -Base 5 # " " "

Každý argument se předává po jednotlivých pozicích nebo jménech. Sadu argumentů však lze předat jako skupinu s rozšířením na jednotlivé argumenty zpracovávané prostředím modulu runtime. Toto automatické rozšíření argumentu se označuje jako splatting . Například

$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

Toho dosáhnete tak, že místo @ použijete $ jako první znak předávané proměnné. Tento zápis lze použít pouze v argumentu příkazu.

Názvy jsou rozděleny do různých oborů názvů, z nichž každý je uložen na virtuální jednotce (§3.1). Například proměnné jsou uloženy na Variable:, proměnné prostředí jsou uloženy na Env:, funkce jsou uloženy na Function:a aliasy jsou uloženy na Alias:. Ke všem těmto názvům lze přistupovat jako k proměnným pomocí oboru názvů proměnných produkce v rozsahu proměnných . Například

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

Jakékoli použití názvu proměnné s explicitním oborem názvů Variable: odpovídá použití stejného názvu proměnné bez této kvalifikace. Například $v a $Variable:v jsou zaměnitelné.

Proměnné mohou být definovány nejen v jazyce samotném, ale také pomocí rutiny New-Variable.

2.3.2.1 Uživatelem definované proměnné

Pro uživatelem definované proměnné je k dispozici libovolný název proměnné, který je povolený gramatikou, ale nepoužívá se automatickými nebo proměnnými předvoleb.

Uživatelem definované proměnné se vytvářejí a spravují pomocí uživatelem definovaného skriptu.

2.3.2.2 Automatické proměnné

Automatické proměnné ukládají informace o stavu prostředí PowerShell. Jejich hodnoty lze číst v uživatelsky psaných skriptech, ale nelze je zapisovat.

Poznámka

Tabulka původně nalezená v tomto dokumentu byla odebrána, aby se snížila duplicita. Úplný seznam automatických proměnných najdete v tématu about_Automatic_Variables.

2.3.2.3 Proměnné předvoleb

Předvolby proměnných ukládají uživatelské předvolby pro relaci. Jsou vytvořeny a inicializovány prostředím runtime PowerShellu. Jejich hodnoty lze číst a zapisovat do uživatelem napsaného skriptu.

Poznámka

Tabulka původně nalezená v tomto dokumentu byla odebrána, aby se snížila duplicita. Úplný seznam proměnných předvoleb najdete v dokumentaci about_Preference_Variables.

2.3.3 Příkazy

Syntax:

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

Syntax:

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

Popis:

Při vyvolání příkazu mohou být informace předány prostřednictvím jednoho nebo více argumentů, jejichž hodnoty jsou přístupné z příkazu prostřednictvím sady odpovídajících parametrů . Proces porovnávání parametrů s argumenty se nazývá vazba parametrů.

Existují tři druhy argumentů:

  • Switch parameter (§8.10.5) - To má podobu příkazodeskového parametru, kde first-parameter-char a parametr-chars dohromady tvoří název přepínače, odpovídající názvu parametru (bez počátečního -) v příkazu, který je vyvolán. Pokud je vynechána koncová dvojtečka, přítomnost tohoto argumentu indikuje, že odpovídající parametr je nastaven na $true. Pokud je přítomna koncová dvojtečka, musí argument bezprostředně za ní určit hodnotu typu bool a odpovídající parametr je nastaven na tuto hodnotu. Například následující vyvolání jsou ekvivalentní:

    Set-MyProcess -Strict
    Set-MyProcess -Strict: $true
    
  • Parametr s argumentem (§8.10.2) – má tvar příkazového parametru, kde první-znak-parametru a znaky-parametru společně tvoří název parametru, který odpovídá názvu parametru (bez počátečního '-') v příkazu, který je vyvolán. Nesmí existovat žádná koncová dvojtečka. Argument bezprostředně následující označuje přidruženou hodnotu. Například pro příkaz Get-Power, který má parametry $Base a $Exponent, jsou ekvivalentní následující vyvolání:

    Get-Power -Base 5 -Exponent 3
    Get-Power -Exponent 3 -Base 5
    
  • Poziční argument (§8.10.2) – Argumenty a jejich odpovídající parametry uvnitř příkazů mají pozice s první pozicí nula. Argument na pozici 0 je vázán na parametr v pozici 0; argument na pozici 1 je vázán na parametr na pozici 1; a tak dále. Například při příkazu Get-Power, který má parametry $Base a $Exponent v pozicích 0 a 1, v tomto pořadí, se tento příkaz vyvolá:

    Get-Power 5 3
    

Podrobnosti o zvláštních parametrech a --naleznete v --% .

Při vyvolání příkazu může být název parametru zkrácen; lze použít jakoukoli odlišnou úvodní část úplného názvu, pokud je jednoznačná s ohledem na názvy ostatních parametrů přijatých stejným příkazem.

Informace o vazbě parametru naleznete v §8.14.

2.3.5 Literály

Syntax:

literal:
    integer-literal
    real-literal
    string-literal

2.3.5.1 Číselné literály

Existují dva druhy číselných literálů: celé číslo (§2.3.5.1.1) a skutečné (§ 2.3.5.1.2). Oba mohou mít přípony násobitele (§2.3.5.1.3).

2.3.5.1.1 Celočíselné literály

Syntax:

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

Popis:

Typ celočíselného literálu je určen jeho hodnotou, přítomností nebo absencí přípony dlouhého typua přítomností číselného násobitele (§2.3.5.1.3).

Pro celočíselné literály, které nemají příponu typu dlouhé

  • Je-li jeho hodnota reprezentována typem int (§4.2.3), je to jeho typ;
  • Jinak, pokud jeho hodnota může být reprezentována typem long (§4.2.3), to je jeho typ.
  • V opačném případě, pokud jeho hodnota může být reprezentována typem desetinné číslo (§2.3.5.1.2), je to jeho typ.
  • V opačném případě je reprezentován typem double (§2.3.5.1.2).

Literálová celočíselná hodnota s dlouhou příponou typu

  • Je-li jeho hodnota reprezentována typem long (§4.2.3), je to jeho typ;
  • Jinak je tento literál špatně sestavený.

Ve dvojkovém doplňkovém kódu celočíselných hodnot je o jednu zápornou hodnotu více než kladných. Pro typ int je tato extra hodnota -2147483648. U dlouhého typu je tato extra hodnota -9223372036854775808. I když by se token 2147483648 obvykle považoval za literál typu long, pokud mu bezprostředně předchází unární operátor minus, tento operátor a literál se považují za literál typu int s nejmenší hodnotou. Podobně, i když by token 9223372036854775808 byl obvykle považován za literál typu decimal, pokud je bezprostředně předcházen unárním operátorem -, pak tento operátor a literál jsou považovány za literál typu long s nejmenší hodnotou.

Některé příklady celočíslovných literálů jsou 123 (int), 123L (long) a 20000000000 (long).

Neexistuje žádná taková věc, jako je celočíselná literál typu bajt.

2.3.5.1.2 Reálné literály

Syntax:

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)

Popis:

Skutečný literál může obsahovat číselný multiplikátor (§2.3.5.1.3).

Existují dva druhy reálného literálu: dvojitý a desetinný. Jsou označeny nepřítomností nebo přítomností přípony typu desetinného čísla. (Neexistuje žádná taková věc, jako je plovoucí bodový literál.)

Dvojitý skutečný literál má typ double (§4.2.4.1). Desetinný reálný literál má typ decimal (§4.2.4.2). Koncové nuly v části zlomku desetinného reálného literálu jsou významné.

Pokud je hodnota exponent-partdesetinné číslice v dvojitém skutečném literálu menší než minimální podporovaná hodnota, hodnota tohoto dvojitého reálného literálu je 0. Pokud je hodnota části exponentus desetinnými číslicemi v desítkovém reálném literálu menší než minimálně podporovaná hodnota, je tento literál špatně vytvořený. Pokud je hodnota exponent-part's desetinné číslice v dvojitém nebo desítkovém skutečném literálu větší než maximální podporovaná hodnota, je tento literál nemocný.

Některé příklady dvojitých skutečných literálů jsou 1., 1.23, .45e35, 32.e+12 a 123.456E-231.

Některé příklady desetinných skutečných literálů jsou 1d (které mají měřítko 0), 1,20d (které má měřítko 2), 1,23450e1d (tj. 12,3450, které má měřítko 4), 1,2345e3d (tj. 1234.5, který má měřítko 1), 1,2345e-1d (tj. 0,12345, který má měřítko 5) a 1,2345e-3d (tj. 0,0012345, který má měřítko 7).

Poznámka

Vzhledem k tomu, že dvojitý skutečný literál nemusí mít zlomek ani exponentní část, seskupování závorek (123). M jsou potřeba k zajištění, že vlastnost nebo metoda M je vybrána pro celočíselné objekt, jehož hodnota je 123. Bez těchto závorek by skutečný literál byl nemocný.

Poznámka

Přestože PowerShell neposkytuje literály pro nekonečno a NaNs, ekvivalenty ve stylu dvojitého reálného literálu lze získat ze statických vlastností pouze pro čtení PositiveInfinity, NegativeInfinity a NaN u typů float a double (§4.2.4.1).

Gramatika umožňuje, že dvojitý reálný literál může mít příponu typu l nebo L. Takový token je skutečně celočíselný literál, jehož hodnota je reprezentována typem long.

Poznámka

Tato funkce byla zachována kvůli zpětné kompatibilitě se staršími verzemi PowerShellu. Programátorům se ale nedoporučuje používat celočíselné literály tohoto tvaru, protože mohou snadno zakrýt skutečnou hodnotu literálu. Například 1,2L má hodnotu 1, 1,2345e1L má hodnotu 12 a 1,2345e-5L má hodnotu 0, z nichž žádný není okamžitě zřejmé.

2.3.5.1.3 Přípony pro násobitele

Syntax:

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

Popis:

Pro usnadnění mohou celočíselné a reálné literály obsahovat numerické násobitele, což označuje jednu ze sady běžně používaných mocnin 10. numerické násobení lze zapsat v libovolné kombinaci velkých nebo malých písmen.

násobitele Význam Příklad
kb kilobajt (1024) 1kb ≡ 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.4e23tb ≡ 1,5393162788864E+35
Pb petabajt (1024 x 1024 x 1024 x 1024 x 1024) 0x12Lpb ≡ 20266198323167232

2.3.5.2 Řetězcové literály

Syntax:

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 @

Popis:

Existují čtyři druhy řetězcových literálů:

  • doslovný řetězcový literál (jednořádkové jednoduché uvozovky), což je posloupnost nula nebo více znaků ohraničených dvojicí jednoduchých uvozoveks. Příklady jsou '' a 'červená'.

  • expandable-string-literal (single-line double-quoted), což je posloupnost obsahující nula nebo více znaků ohraničená dvojicí dvojitých uvozovek. Příklady jsou "" a "červená".

  • doslovný textový řetězec (víceřádkový příkaz s jednoduchými uvozovkami), což je posloupnost nula nebo více znaků ohraničených dvojicemi znaků @znak jednoduché uvozovky a znak jednoduché uvozovky@, všechny obsažené na dvou nebo více zdrojových řádcích. Příklady:

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • expandable-here-string-literal (víceřádkové s dvojitými uvozovkami), což je posloupnost nula nebo více znaků oddělených dvojicí znaků @dvojitým uvozovkovým znakem a dvojitým uvozovkovým znakem@, všechny obsažené na dvou nebo více zdrojových řádcích. Příklady:

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

Pro doslovné literálya rozbalitelné literályplatí, že kromě bílých znaků (které se ignorují) nesmí žádné znaky následovat na stejném zdrojovém řádku jako otevírací dvojice znaků oddělovače, a nesmí předcházet na stejném zdrojovém řádku jako uzavírací dvojice znaků oddělovače.

Text doslovné doslovné řetězcového literálu nebo rozbalitelného textového liter álu začíná na začátku prvního zdrojového řádku za levým oddělovačem a končí na konci posledního zdrojového řádku před ukončovacím oddělovačem. Tělo může být prázdné. Ukončovací znak řádku posledního zdrojového řádku, který předchází koncovému oddělovači, není součástí textu literálu.

Literál některého z těchto druhů má typ řetězec (§4.3.1).

Znak použitý k oddělení doslovného řetězcového literálu nebo rozšiřitelného řetězcového literálu může být obsažen v tomto řetězcovém literálu tak, že tento znak je zapsán dvakrát po sobě. Například 'What''s the time?' a "I said, ""Hello"".". jednoznakový znak však nemá žádný zvláštní význam uvnitř rozbalitelného řetězcového literálua dvouznakový znak nemá žádný zvláštní význam uvnitř doslovného literálu s doslovným řetězcem.

rozšiřitelného řetězcového literálu a rozbalitelného řetězcového literálu může obsahovat escapovaný znaks (§2.3.7). Pokud je například do kanálu zapsán následující řetězcový literál, výsledek je následující:

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

Pokud expandable-string-literal nebo expandable-here-string-literal obsahuje název proměnné, pokud tento název není bezprostředně před řídicím znakem, nahradí se řetězcovou reprezentací hodnoty této proměnné (§6.7). To se označuje jako nahrazení proměnné.

Poznámka

Pokud je název proměnné součástí nějakého většího výrazu, nahradí se pouze název proměnné. Pokud je například $a pole obsahující prvky 100 a 200, ">$a.Length<" dává >100 200.Length<, zatímco ">$($a.Length)<" dává >2<. Viz rozšíření podvýrazu níže.

Například zdrojový kód

$count = 10
"The value of `$count is $count"

výsledkem je expandable-string-literal

The value of $count is 10.

Vezměte v úvahu následující skutečnosti:

$a = "red","blue"
"`$a[0] is $a[0], `$a[0] is $($a[0])" # second [0] is taken literally

Výsledek je

$a[0] is red blue[0], $a[0] is red

expandable-string-literals a expandable-here-string-literals také podporují druh nahrazení nazývaného rozšíření dílčího výrazu, tím, že s textem formuláře $( ... ) zachází jako s dílčím výrazem (§7.1.6). Takový text je nahrazen řetězcovou reprezentací hodnoty tohoto výrazu (§6.8). Jakékoli prázdné znaky používané k oddělení tokenů v rámci dílčího výrazu seznamu příkazů se ignorují, pokud jde o konstrukci výsledného řetězce.

Příklady:

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

výsledkem je následující expandable-string-literals:

10 + 5 is 15
10 + 5 is $(10 + 5)
10 + 5 is $($count + 5)

Následující zdroj:

$i = 5; $j = 10; $k = 15
"`$i, `$j, and `$k have the values $( $i; $j; $k )"

výsledkem je následující expandable-string-literal:

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

Tyto čtyři řádky by mohly být stručněji napsány takto:

"`$i, `$j, and `$k have the values $(($i = 5); ($j = 10); ($k = 15))"

V následujícím příkladu:

"First 10 squares: $(for ($i = 1; $i -le 10; ++$i) { "$i $($i*$i) " })"

výsledná rozšiřitelná textová konstanta je následující:

First 10 squares: 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100

Jak je znázorněno, dílčí výraz může obsahovat řetězcové literály s nahrazením proměnných i rozšířením dílčího výrazu. Všimněte si také, že vnitřní oddělovače expandable-string-literalnemusí být escapovány; skutečnost, že jsou uvnitř dílčího výrazu, znamená, že nemohou být ukončovacími znaky pro vnější expandable-string-literal.

expandable-string-literal nebo expandable-here-string-literal obsahující proměnnou nahrazení nebo rozšíření dílčího výrazu se vyhodnotí při každém použití literálu; například

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

výsledkem je následující expandable-string-literals:

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

Obsah literálu doslovného řetězce je přebírán doslovně, včetně všech počátečních nebo koncových prázdných znaků v textu. Proto vložené jednoznakový znaknemusí být zdvojnásobené a neexistuje žádná náhrada ani rozšíření. Například

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

což vede k doslovnému výsledku

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

Obsah rozbalitelného řetězcového literálu se řídí nahrazením a rozšířením, ale jakékoli počáteční nebo koncové prázdné znaky v těle, ale mimo jakékoli dílčí výrazys se přebírají doslovně a vložené dvojité uvozovkynemusí být dvojitě zdvojené. Například

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

výsledkem je následující text, když je rozbalen:

That's it!
2 * 3 = 6

Pro doslovné doslovné literály here-string-literals a expandable-here-string-literals, každý ukončovací znak řádku v těle je reprezentován výsledným literálem definovaným implementací. Například v

$lit = @"
abc
xyz
"@

Druhý řádek těla má dvě úvodní mezery a první i druhý řádek těla mají ukončovací znaky; nicméně, ukončovací znak druhého řádku těla je , nikoliv jako součást tohoto těla. Výsledný literál je ekvivalentní: "abc<implementation-defined character sequence>xyz".

Poznámka

Kvůli lepší čitelnosti zdroje je možné dlouhé řetězcové literály rozdělit napříč více zdrojovými řádky, aniž by se vkládaly ukončovací čáry řádků. To se provádí zápisem každé části jako samostatného literálu a zřetězení částí pomocí operátoru + (§7.7.2). Tento operátor umožňuje svým operandům určit libovolný ze čtyř typů řetězcového literálu.

Poznámka

I když neexistuje taková věc jako literál znaku jako takový, stejný účinek lze dosáhnout přístupem k prvnímu znaku v řetězci s 1 znakem, například: [char]"A" nebo "A"[0].

Pro doslovné řetězcea rozbalitelné řetězceje každý ukončovač řádku v těle reprezentován přesně tak, jak byl zadán.

2.3.5.3 Literál null

Viz automatická proměnná $null (§2.3.2.2).

2.3.5.4 Booleovské literály

Viz automatické proměnné $false a $true (§ 2.3.2.2).

2.3.5.5 Maticové literály

PowerShell umožňuje zápis výrazů typu matice (§9) pomocí unárního čárkového operátoru (§7.2.1), maticový výraz (§7.1.7), binární operátor čárky (§7.3) a operátor rozsahu (§7.4).

2.3.5.6 Hašové literály

PowerShell umožňuje zápis výrazů typu Hashtable (§10) pomocí hash-literal-expression (§7.1.9)

2.3.5.7 Typy názvů

Syntax:

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 Operátory a interpunkční znaky

Syntax:

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

Popis:

&& a || jsou vyhrazeny pro budoucí použití.

Poznámka

Poznámka editoru: Operátory řetězu kanálů && a || byly zavedeny v PowerShellu 7. Viz about_Pipeline_Chain_Operators.

Název za pomlčkou v operátoru je vyhrazen pouze pro tento účel v kontextu operátoru.

Operátor začínající pomlčkou nesmí mít žádné prázdné znaky mezi tou pomlčkou a tokenem, který následuje.

2.3.7 Escapované znaky

Syntax:

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

Popis:

řídicí znak je způsob, jak přiřadit speciální interpretaci znaku tím, že mu poskytnete předponu zpětného znaku (U+0060). Následující tabulka uvádí význam každého escapovaného znaku:

Escapovaný znak Význam
`a Upozornění (U+0007)
`b Backspace (U+0008)
`f Podávání formulářů (U+000C)
`n Nový řádek (U+000A)
`r Průvod návratu (U+000D)
`t Horizontální tabulátor (U+0009)
`v Vertikální tabulátor (U+0009)
`' Jednoduchá uvozovka (U+0027)
`" Dvojitá uvozovka (U+0022)
`` Backtick (U+0060)
`0 NUL (U+0000)
`x Pokud x je jiný znak než tyto znaky uvedené výše, znak zpětného znaména se ignoruje a x se bere doslova.

Důsledkem poslední položky v tabulce výše je, že mezery, které by jinak oddělovaly tokeny, mohou být místo toho součástí tokenu. Například název souboru obsahující mezeru lze zapsat jako Test` Data.txt (a také 'Test Data.txt' nebo "Test Data.txt").