2. lexikální struktura

2,1 gramatiky

Tato specifikace zobrazuje syntaxi jazyka PowerShellu pomocí dvou gramatik. Lexikální gramatika (§ B. 1) ukazuje, jakým způsobem jsou znaky Unicode kombinovány s ukončovacími znaky řádků, komentáři, prázdnými znaky a tokeny. Syntaktická gramatika (§ B. 2) ukazuje, jak jsou tokeny vyplývající z lexikální gramatiky kombinovány ve formě skriptů prostředí PowerShell.

Pro usnadnění práce jsou fragmenty těchto gramaticky replikovány na vhodných místech v rámci této specifikace.

Jakékoli použití znaků "a" až "z" v gramatikách rozlišuje malá a velká písmena. To znamená, že velká písmena v proměnných, aliasy, názvy funkcí, klíčová slova, příkazy a operátory se ignorují. V rámci této specifikace se ale tyto názvy píší malými písmeny, s výjimkou některých automatických proměnných a proměnných předvoleb.

2,2 lexikální analýza

2.2.1 – skripty

Syntaxe:

Tip

~opt~Zápis 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 prostředí PowerShell je vstup ve skriptu, který obsahuje posloupnost znaků Unicode. Lexikální zpracování tohoto streamu zahrnuje snížení těchto znaků do sekvence tokenů, které se stanou vstupem syntaktické analýzy.

Skript je skupina příkazů PowerShellu, které jsou uložené v souboru skriptu. Samotný skript nemá žádný název, za se a přebírá jeho 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í vyžadováno ke zpracování textu, který následuje za signaturou nebo cokoli, co vypadá jako podpis. Tato specifikace nepokrývá vytváření a používání digitálních podpisů.

2.2.2 ukončení řádků

Syntaxe:

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 nového znaku ve vstupním datovém proudu je rozdělena do řádků, které lze použít pro takové věci jako zasílání zpráv o chybách a rozpoznávání konce jednořádkových komentářů.

Ukončovací znak řádku se může považovat za prázdné místo (§ 2.2.4).

Komentáře 2.2.3

Syntaxe:

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:

Zdrojový kód lze opatřit poznámkami pomocí komentářů.

Jednořádkový komentář začíná znakem a končí znakem # New-line-Character.

Oddělený komentář začíná dvojicí <# znaků a končí dvojicí #> znaků. Může se vyskytnout jako součást zdrojového řádku, jako celý řádek zdroje, nebo může být rozložená na libovolný počet zdrojových řádků.

Komentář je považován za prázdný znak.

Výše uvedená výroba implikuje tuto skutečnost

  • Komentáře se nevnořují.
  • Sekvence znaků < # a # > nemají žádný zvláštní význam v jednom řádku komentáře.
  • Znak # nemá žádný zvláštní význam v komentáři s oddělovačem.

Lexikální gramatika znamená, že v tokenech nemůžou být komentáře.

(Viz § A pro informace o vytváření souborů skriptu, které obsahují komentáře se speciálními hodnotami, které se používají ke generování dokumentace ze souborů skriptu.)

Příkaz vyžaduje komentář určuje kritéria, která musí být splněna pro příslušný skript, který má být spuštěn. Primárním kritériem je verze PowerShellu, která se používá ke spuštění skriptu. Minimální požadavek na verzi je uveden následujícím způsobem:

#requires -Version N[.n]

Kde n je (požadovaná) hlavní verze a n je (nepovinná) vedlejší verze.

Vyžaduje – komentář může být přítomen v jakémkoli souboru skriptu; nedá se ale vyskytovat uvnitř funkce nebo rutiny. Musí se jednat o první položku na zdrojovém řádku. Skript může obsahovat více vyžaduje příkaz-Comment s.

Sekvence znaků je rozpoznána pouze jako komentář, pokud tato sekvence začíná # nebo <# . Například Hello # se považuje za jeden token, zatímco dobrý #there je považován za token Hello následovaný jedním řádkem komentáře. Stejně jako následující prázdné znaky, lze sekvenci začátku komentáře také předcházet libovolným ukončovacím znakem výrazu nebo příkazem ukončujícím příkazy (například ) , } , ] ' ,, " nebo ; ).

V modulu snap-in nelze vyskytovat Komentář .

Existují čtyři další formy typu vyžaduje-komentář:

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

2.2.4 mezera

Syntaxe:

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:

Prázdný znak se skládá z libovolného pořadí jednoho nebo více prázdných znaků.

S výjimkou toho, že prázdné místo může fungovat jako oddělovač pro tokeny, je ignorováno.

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

$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 indikuje, že se zdrojový řádek pokračuje. Následující výraz je ekvivalentní k $number = 10 + 20 - 50 .

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

tokeny 2,3

Syntaxe:

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 PowerShell.

Tokeny mohou být odděleny novými řádky, komentáři, prázdným znakem nebo libovolnou kombinací.

2.3.1 – klíčová slova

Syntaxe:

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 sekvence znaků, které mají zvláštní význam při použití na místě závislém na kontextu. Nejčastěji se jedná o první token v příkazu; Existují však další umístění, která jsou označena gramatikou. (Token, který vypadá jako klíčové slovo, ale není používán v kontextu klíčového slova, je název příkazového řádku nebo příkazový argument.)

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

Poznámka

Poznámka k class editoru: klíčová slova a using byla představena v prostředí PowerShell 5,0. Viz about_Classes a about_Using.

2.3.2 – proměnné

Syntaxe:

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ěji popsány v tématu (§ 5). Proměnná $? je vysvětleno v § 2.3.2.2. Obory 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 psaní názvu proměnné: název proměnné ve složených závorkách, který začíná $ znakem, následovaný složenou závorkou, která je oddělená sadou jednoho nebo více znaků, a běžný název proměnné, který také začíná znakem $ , následovaný sadou jednoho nebo více znaků z větší omezující sady, než je povolený název proměnné 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 proměnné v závorkách.

$totalCost
$Maximum_Count_26

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

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

Neexistuje žádné omezení délky názvu proměnné, všechny znaky v názvu proměnné jsou významné a velká písmena se neliší.

Existuje několik různých typů proměnných: User-defined (§ 2.3.2.1), Automatic (§ 2.3.2.2) a preference (§ 2.3.2.3). Můžou všechny koexistovat ve stejném oboru (§ 3,5).

Vezměte v úvahu následující definice 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 je předán podle pozice nebo názvu, po jednom. Nicméně sadu argumentů lze předat jako skupinu s rozšířením do jednotlivých argumentů zpracovávaných běhovým prostředím. Toto automatické rozšíření argumentu se označuje jako seskupováním. Třeba

$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

To se dá dosáhnout použitím @ místo $ jako prvního znaku 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 Env: na, funkce jsou uloženy na Function: a aliasy jsou uloženy v Alias: . Všechny tyto názvy jsou k dispozici jako proměnné pomocí produkčního oboru názvů v rámci proměnné oboru. Třeba

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í proměnné s explicitním Variable: oborem názvů je ekvivalentem použití stejného názvu proměnné bez této kvalifikace. Například $v a $Variable:v jsou zaměnitelné.

I pro definování v jazyce lze proměnné také definovat pomocí rutiny New-Variable.

2.3.2.1 uživatelsky definované proměnné

Libovolný název proměnné povolený gramatikou, ale nepoužívá se automaticky nebo proměnné předvolby, jsou k dispozici pro proměnné definované uživatelem.

Uživatelem definované proměnné jsou vytvořeny a spravovány uživatelem definovaným skriptem.

2.3.2.2 automatické proměnné

Automatické proměnné ukládají informace o stavu prostředí PowerShell. Jejich hodnoty se dají číst v uživatelsky zapsaném skriptu, ale nezapisují se.

Poznámka

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

proměnné předvoleb 2.3.2.3

Proměnné předvoleb ukládají předvolby uživatele pro relaci. Vytvoří a inicializuje běhové prostředí PowerShell. Jejich hodnoty je možné číst a zapisovat v uživatelsky vytvořeném 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 tématu about_Preference_Variables.

příkazy 2.3.3

Syntaxe:

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 $(

parametry 2.3.4

Syntaxe:

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 k dispozici v rámci příkazu prostřednictvím sady odpovídajících parametrů. Proces porovnání parametrů s argumenty se nazývá vazba parametrů.

Existují tři druhy argumentu:

  • Switch – parametr (§ 8.10.5) – obsahuje parametr příkazového řádku , kde první parametr-char a parametr-chars tvoří název přepínače, který odpovídá názvu parametru (bez jeho začátku - ) v příkazu, který je vyvolán. Pokud je koncová dvojtečka vynechána, přítomnost tohoto argumentu označuje, že odpovídající parametr je nastaven na $true hodnotu. Pokud je k dispozici koncová dvojtečka, musí argument okamžitě následovat po hodnotě 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á parametr příkazového řádku , kde první parametr-char a parametr-chars tvoří název parametru, který odpovídá názvu parametru (bez jeho začátku) ve vyvolaném příkazu. Nesmí existovat žádná koncová dvojtečka. Argument bezprostředně následuje označení přidružené hodnoty. Například kvůli příkazu Get-Power , který má parametry $base a $exponent , jsou následující vyvolání ekvivalentní:

    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 v příkazech mají pozice s první pozicí nula. Argument na pozici 0 je svázán s parametrem na pozici 0; Argument na pozici 1 je svázán s parametrem na pozici 1; a tak dále. Například s ohledem na příkaz Get-Power , který má parametry $base a $exponent na pozicích 0 a 1 v uvedeném pořadí, vyvolá následující příkaz:

    Get-Power 5 3
    

Podrobnosti o zvláštních parametrech -- a --% naleznete v tématu § 8,2 .

Při vyvolání příkazu může být název parametru zkrácen; může být použita jakákoli odlišná úvodní část úplného názvu, pokud jde o názvy dalších parametrů přijatých stejným příkazem, která je jednoznačná.

Informace o vazbách parametrů naleznete v tématu § 8,14.

2.3.5 – literály

Syntaxe:

literal:
    integer-literal
    real-literal
    string-literal

2.3.5.1 číselné literály

Existují dva druhy číselných literálů: Integer (§ 2.3.5.1.1) a Real (§ 2.3.5.1.2). Oba můžou mít přípony násobitele (§ 2.3.5.1.3).

2.3.5.1.1 celočíselné literály

Syntaxe:

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 absence dlouhého typu přípony a přítomnost číselného násobitele (§ 2.3.5.1.3).

Celočíselný literál bez přípony dlouhého typu

  • Pokud jeho hodnota může být reprezentována pomocí typu int (§ 4.2.3), který je jeho typem;
  • V opačném případě, pokud jeho hodnota může být reprezentována typem Long (§ 4.2.3), což je jeho typ.
  • V opačném případě, pokud jeho hodnota může být reprezentována typem Decimal (§ 2.3.5.1.2), který je jeho typem.
  • V opačném případě je reprezentace typu Double (§ 2.3.5.1.2).

Celočíselný literál s příponou Long-Type

  • Pokud jeho hodnota může být reprezentována typem Long (§ 4.2.3), který je jeho typem;
  • V opačném případě je tento literál nesprávně vytvořen.

V dvojkového-doplňkový reprezentace celočíselných hodnot existuje jedna záporná hodnota, než je kladné. Pro typ int, tato hodnota navíc je-2147483648. Pro typ Long, tato hodnota navíc je-9223372036854775808. I když se token 2147483648 obvykle považuje za literál typu Long, pokud je před ním bezprostředně unárním operátorem-operator, Tento operátor a literál se považují za literál typu int, který má nejmenší hodnotu. Podobně i v případě, že 9223372036854775808 tokenu by byl obvykle považován za skutečný literál typu Decimal, pokud je bezprostředně před ním unární operátory, je tento operátor a literál považován za literál typu dlouhý s nejmenší hodnotou.

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

Neexistuje žádná taková věc jako celočíselný literál typu Byte.

2.3.5.1.2 reálné literály

Syntaxe:

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 numerický násobitel (§ 2.3.5.1.3).

Existují dva druhy reálného literálu: Double a Decimal. Ty jsou označeny nepřítomností nebo přítomnosti, v uvedeném pořadí, v desítkové příponě typu. (Taková věc není typu float reálného literálu.)

Typ Double reálného literálu je typu Double (§ 4.2.4.1). Desítkový skutečný literál má typ Decimal (§ 4.2.4.2). Koncové nuly v části zlomku desítkového reálného literálu jsou významné.

Pokud je hodnota desítkových číslic exponentu v dvojitém reálném literálu menší než minimální podporovaná hodnota, hodnota tohoto Double reálného literálu je 0. Pokud je hodnota desítkových číslic exponentu v desítkovém literálu typu Decimal menší než minimální podporovaná, je tento literál nesprávně vytvořen. Pokud je hodnota desítkových číslic exponentu v dvojitém nebo desítkovém literálu větší než maximální podporovaná, je tento literál nesprávně vytvořen.

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

Některé příklady desítkových reálných literálů jsou 1d (což má stupnici 0). 1,20 d (s měřítkem 2), 1.23450 E1D (tj. 12,3450, který má škálování 4), číslo 1,2345 E3D (tj. 1234,5, který má měřítko 1), číslo 1,2345 e-1d (tj. 0,12345, která má stupnici 5), a číslo 1,2345 e-3D (tj., který má stupnici 7). 0,0012345

Poznámka

Vzhledem k tomu, že dvoje reálné literály nemusí mít část zlomu nebo exponent, závorky v (123). M je potřeba, aby se zajistilo, že vlastnost nebo metoda M se vybírá pro celočíselný objekt, jehož hodnota je 123. Bez těchto závorek by byl literál reálného čísla nesprávně vytvořen.

Poznámka

I když prostředí PowerShell neposkytuje literály pro nekonečné a hodnoty NaN, Double reálné literály podobné ekvivalenty lze získat ze statických vlastností jen pro čtení PositiveInfinity, NegativeInfinity a NaN typů float a Double (§ 4.2.4.1).

Gramatika umožňuje, co začíná jako dvojitý skutečný literál, který l má příponu typu nebo L . Takový token je ve skutečnosti celočíselný literál, jehož hodnota je reprezentována typu Long.

Poznámka

Tato funkce byla zachována z důvodu zpětné kompatibility se staršími verzemi prostředí PowerShell. Nicméně programátoři nedoporučuje používat celočíselné literály tohoto formuláře, protože mohou snadno překrýt skutečnou hodnotu literálu. Například 1,2 L má hodnotu 1, číslo 1,2345 e1L má hodnotu 12 a číslo 1,2345 e-5L má hodnotu 0, žádná z nich je okamžitě zřejmá.

přípony násobitelů 2.3.5.1.3

Syntaxe:

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

Popis:

Pro pohodlí můžou celočíselné a reálné literály obsahovat numerický násobitel, který označuje jednu ze sady běžně využívaných mocnin 10. numerický násobitel lze zapsat v libovolné kombinaci velkých a malých písmen.

Koeficient Význam Příklad
Knowledge kilobajt (1024) 1 KB ≡ 1024
MB megabajtů (1024 x 1024) 1.30 DMB ≡ 1363148,80
GB gigabajt (1024 x 1024 × 1024) 0x10Gb ≡ 17179869184
TB terabajt (1024 x 1024 × 1024 × 1024) 1.4 e23tb ≡ 1.5393162788864 E + 35
PB řádu petabajtů (1024 x 1024 × 1024 × 1024 × 1024) 0x12Lpb ≡ 20266198323167232

řetězcové literály 2.3.5.2

Syntaxe:

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 typy řetězcových literálů:

  • doslovné hodnoty – řetězcový literál (jednořádkový Single-quot), což je sekvence nula nebo více znaků oddělených dvojicí jednoduchých uvozovek – znak s. Příklady jsou ' ' a ' Red '.

  • rozšiřitelný – řetězcový literál (jednořádkový dvojité dvojité uvozovky), což je sekvence nula nebo více znaků oddělených dvojicí dvojitých uvozovek – znaků s. Příklady jsou "" a "Red".

  • doslovné – řetězcový literál (víceřádkové jednoduché), což je sekvence nula nebo více znaků oddělených páry znaků @jednoduché uvozovky a znak jednoduché uvozovky(v uvedeném pořadí), který je obsažený ve dvou nebo více zdrojových řádcích. Příklady:

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • rozšiřitelný – řetězcový literál (víceřádkové dvojité uvozovky), což je sekvence nula nebo více znaků oddělených páry znaků @dvojité uvozovky-Character a dvojité uvozovky, které jsou obsaženy na dvou nebo více zdrojových řádcích. Příklady:

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

U doslovného řetězce typu String-Literal a Expanded-string-literal s výjimkou prázdného znaku (který se ignoruje) žádné znaky se nemůžou nacházet na stejném řádku zdroje jako dvojice znakem pravého oddělovače.

Tělo doslovného řetězce, literálu nebo rozšiřitelného řetězce , začíná na začátku prvního řádku zdroje po počátečním oddělovači a končí na konci posledního řádku zdroje před uzavíracím oddělovačem. Tělo může být prázdné. Znak ukončení řádku na posledním řádku zdroje předcházejícím uzavíracímu oddělovači není součástí těla tohoto literálu.

Literály některého z těchto typů mají řetězec typu (§ 4.3.1).

Znak použitý k vymezení 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 se tento znak dvakrát zapíše do úspěchu. Příklad: 'What''s the time?' a "I said, ""Hello"".". Nicméně znak jednoduché uvozovky nemá žádný zvláštní význam uvnitř rozšiřitelného-řetězcového literálu a znak dvojité uvozovky nemá žádný zvláštní význam uvnitř doslovného řetězcového literálu.

Rozbalením řetězcového literálu a rozšiřitelného řetězcového literálu může obsahovat řídicí znaky s řídicím znakem(§ 2.3.7). Například při zápisu následujícího řetězcového literálu do kanálu je výsledek jak je znázorněno níže:

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

Pokud je název proměnné s rozšiřitelným řetězcem nebo rozšiřitelným řetězcem, který obsahuje název proměnné, pokud tento název nepředchází bezprostředně řídicím znakem, je nahrazen řetězcovou reprezentací hodnoty této proměnné (§ 6,7). Tato proměnná se označuje jako náhrada proměnných.

Poznámka

Pokud je název proměnné součástí nějakého většího výrazu, nahradí se jenom název proměnné. Například pokud $a je pole obsahující prvky 100 a 200, ">$a.Length<" výsledkem >100 200.Length< ">$($a.Length)<" >2< bude výsledek. Viz následující rozšíření dílčího výrazu.

Například zdrojový kód

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

Výsledkem je rozšiřitelný řetězcový literál

The value of $count is 10.

Zvažte použití těchto zdrojů:

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

Výsledek bude

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

rozšiřitelné-řetězcové literály s a rozšiřitelné – řetězcový literál s podporuje také typ náhrady s názvem rozšíření dílčího výrazu, který zpracovává text formuláře $( ... ) jako dílčí výraz (§ 7.1.6). Takový text je nahrazen řetězcovou reprezentací hodnoty tohoto výrazu (§ 6,8). Jakékoli prázdné místo použité pro samostatné tokeny v rámci příkazu dílčího výrazu – seznam se ignoruje, pokud je dotčena konstrukce 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í rozšiřitelný řetězcový literál s:

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í rozšiřitelný řetězcový literál:

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

Tyto čtyři řádky by mohly být popsány podrobněji 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ý řetězcový literál 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, které mají jak záměnu proměnných, tak i dílčí výraz. Všimněte si také, že oddělovače vnitřních s rozšiřitelným řetězcovým literálem nemusejí být uvozeny řídicími znaky; fakt, že jsou uvnitř dílčího výrazu , znamená, že nemohou být zakončeny pro vnější rozšiřitelný řetězcový literál.

Výraz s rozšiřitelným řetězcem nebo rozšiřitelným řetězcem, který obsahuje náhradní proměnnou nebo rozšíření dílčího výrazu, se vyhodnocuje pokaždé, když se literál používá; 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í rozšiřitelný řetězcový literál s:

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

Obsah literálu v doslovném řetězci se bere v omyl, včetně úvodního nebo koncového prázdného místa v těle. V takovém případě nemusí být vložená jednotlivá znaková uvozovka Dvojitá a žádná náhrada ani rozšíření. Třeba

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

což vede k literálu

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

Obsah rozšiřujícího literálu , který se dá rozšířit, se může vztahovat k nahrazení a rozšíření, ale na začátku nebo na konci prázdného znaku v těle, ale mimo jakýkoliv dílčí výraz s, se převezme doslovné znění a vložené dvojité uvozovky nemusejí být dvojité. Třeba

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

Výsledkem je následující literál při rozbalení:

That's it!
2 * 3 = 6

Pro každý znak v podobě řetězce a literálu s příznakem " v řetězci", je každý ukončovací znak v těle reprezentován ve výsledném literálu v uživatelsky definovaném způsobu implementace. Například v

$lit = @"
abc
xyz
"@

druhý řádek těla má dva úvodní mezery a první a druhý řádek těla obsahuje zakončení řádků; ale ukončovací znak druhého řádku těla není součástí tohoto textu. Výsledný literál je ekvivalentní k: "abc<implementation-defined character sequence>xyz" .

Poznámka

Aby bylo možné v rámci podpory čitelnosti zdroje, dlouhé řetězcové literály mohou být rozděleny na více zdrojových řádků bez vložení ukončovacího zakončení řádku. To se provádí zápisem každé části jako samostatného literálu a zřetězením částí s operátorem + (§ 7.7.2). Tento operátor umožňuje jeho operandům určit libovolný ze čtyř druhů řetězcového literálu.

Poznámka

I když neexistují žádné takové věci jako literály znaků za se, stejného efektu lze dosáhnout přístupem k prvnímu znaku v řetězci s jedním znakem, a to následujícím způsobem: [char]"A" nebo "A"[0] .

Pro každý znak v podobě řetězce a literálu, který je k dispozici-Literal- String-Literal, je každý znak ukončení v těle reprezentován přesně tak, jak byl poskytnut.

2.3.5.3 literál s hodnotou null

Podívejte se na automatickou proměnnou $null (§ 2.3.2.2).

2.3.5.4 logické literály

Podívejte se na automatické proměnné $false a $true (§ 2.3.2.2).

literály pole 2.3.5.5

PowerShell umožňuje psát výrazy typu pole (§ 9) pomocí unárního operátoru čárky (§ 7.2.1), Array-Expression (§ 7.1.7), binárního operátoru čárka (§ 7,3) a operátoru Range (§ 7,4).

2.3.5.6 literály hash

PowerShell umožňuje zapsat výrazy typu hash (§ 10) pomocí výrazu hash-Literal (§ 7.1.9).

názvy typů 2.3.5.7

Syntaxe:

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 [

operátory 2.3.6 a interpunkční znaky

Syntaxe:

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 vyhrazené pro budoucí použití.

Poznámka

Poznámka redaktora: operátory && řetězu kanálu a || byly představeny v prostředí PowerShell 7. Viz about_Pipeline_Chain_Operators.

Název následující pomlčky v operátoru je vyhrazen pro tento účel pouze v kontextu operátoru.

Operátor, který začíná pomlčkou , nesmí mít mezeru mezi pomlčkou a tokenem, který ho následuje.

řídicí znaky 2.3.7

Syntaxe:

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

Popis:

Řídicí znak je způsob, jak přiřadit speciální výklad k znaku tím, že mu udělíte znak pro zpětný odkaz (U + 0060). V následující tabulce je uveden význam každého řídicího znaku:

Řídicí znak Význam
`a Výstraha (U + 0007)
`b Backspace (U + 0008)
`f Formulářový kanál (U + 000C)
`n New-line (U + 000A)
`r Návrat na začátek řádku (U + 000D)
`t Horizontální karta (U + 0009)
`v Svislá karta (U + 0009)
`' Jednoduchá uvozovka (U + 0027)
`" Dvojité uvozovky (U + 0022)
`` Značka 0060 (U +)
`0 NUL (U + 0000)
`x Pokud x je znak jiný než výše zobrazené znaky, znak pro zatržení se ignoruje a x je proveden doslova.

Výsledkem konečné položky v tabulce výše je to, že místo toho mohou být jako součást tokenu součástí tokenu místo, kde by jinak byly oddělené tokeny. Například název souboru, který obsahuje mezeru, může být napsán jako Test` Data.txt (také 'Test Data.txt' nebo "Test Data.txt" ).