2. Lexikal struktur

2.1 Grammatik

Den här specifikationen visar syntaxen för PowerShell-språket med hjälp av två grammatiker. Lexikal grammatik (**B.1) visar hur Unicode-tecken kombineras för att bilda radterminatorer, kommentarer, blanksteg och token. Den syntaktiska grammatiken (·B.2) visar hur de token som är resultatet av den lexikala grammatiken kombineras för att bilda PowerShell-skript.

För enkelhetens skull replikeras fragment av dessa grammatiker på lämpliga platser i den här specifikationen.

All användning av tecknen "a" till och med "z" i grammatiken är inte case-känslig. Det innebär att bokstavsfallet i variabler, alias, funktionsnamn, nyckelord, instruktioner och operatorer ignoreras. I den här specifikationen skrivs sådana namn dock i gemener, förutom vissa automatiska variabler och inställningsvariabler.

2.2 Lexikal analys

2.2.1 Skript

Syntax:

Tips

Notationen ~opt~ i syntaxdefinitionerna anger att den lexikala entiteten är valfri i syntaxen.

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

Beskrivning:

Indatakällan till en PowerShell-translator är indata i ett skript som innehåller en sekvens med Unicode-tecken. Den lexikala bearbetningen av den här dataströmmen innebär att dessa tecken minskar till en sekvens med token, som sedan blir indata för syntaktisk analys.

Ett skript är en grupp med PowerShell-kommandon som lagras i en skriptfil. Själva skriptet har inget namn, i sig, och tar sitt namn från källfilen. Slutet på filen anger slutet av skriptet.

Ett skript kan eventuellt innehålla en digital signatur. En värdmiljö krävs inte för att bearbeta text som följer en signatur eller något som ser ut som en signatur. Skapandet och användningen av digitala signaturer omfattas inte av den här specifikationen.

2.2.2 Radterminatorer

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

Beskrivning:

Förekomsten av nya radtecken i indatakällan delar upp den i rader som kan användas för exempelvis felrapportering och identifiering av slutet av en kommentar med en rad.

En radterminator kan behandlas som tomt utrymme (2.2.4).

2.2.3 Kommentarer

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 #

Beskrivning:

Källkoden kan kommenteras med hjälp av kommentarer.

En kommentar med en rad börjar med tecknet och # slutar med ett nytt radtecken.

En avgränsad kommentar börjar med teckenparet och <# slutar med teckenparet #>. Det kan ske som en del av en källrad, som en hel källrad, eller så kan den sträcka sig över val annat antal källrader.

En kommentar behandlas som tomt utrymme.

Ovanstående produktioner innebär att

  • Kommentarerna kapslas inte.
  • Teckensekvenserna <# och #> har ingen särskild betydelse i en enkelradskommentar.
  • Tecknet # har ingen särskild betydelse i en avgränsad kommentar.

Den lexikala grammatiken antyder att kommentarer inte kan förekomma i token.

(Mer information om hur du skapar skriptfiler som innehåller specialvärdeskommentarer som används för att generera dokumentation från skriptfiler finns i .)

En kräver-kommentar anger de kriterier som måste uppfyllas för att dess innehållande skript ska kunna köras. Det primära kriteriet är den version av PowerShell som används för att köra skriptet. Minimikravet för versionen anges på följande sätt:

#requires -Version N[.n]

Där N är den (obligatoriska) huvudversionen och n är den (valfria) delversionen.

En requires-comment kan finnas i alla skriptfiler. Den kan dock inte finnas i en funktion eller cmdlet. Det måste vara det första objektet på en källrad. Ett skript kan innehålla flera requires-comments.

En teckensekvens identifieras bara som en kommentar om sekvensen börjar med # eller <#. Till exempel betraktas hello#som en enda token medan hello #there betraktas som token hello följt av en kommentar på en rad. Liksom följande blanksteg kan kommentarens startsekvens också föregås av ett uttrycks-avslutande eller instruktionsterminerande tecken ( )till exempel , }, ], ', ", eller ;).

Det går inte att lägga till en kommentar i en snapin-modulen.

Det finns fyra andra former av en requires-comment:

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

2.2.4 Blanksteg

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

Beskrivning:

Blanksteg består av en sekvens med ett eller flera blankstegstecken .

Förutom att tomt utrymme kan fungera som en avgränsare för token ignoreras det.

Till skillnad från vissa populära språk betraktar PowerShell inte radterminatortecken (2.2.2) som blanksteg. En radparentator kan dock behandlas som tomt utrymme genom att den föregås direkt av ett bakåtklicktecken ` (U+0060). Detta är nödvändigt när innehållet på en rad är fullständigt syntaktiskt, men följande rad innehåller token som är avsedda att associeras med föregående rad. Exempel:

$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

I det här exemplet indikerar backticken att källraden har fortsatt. Följande uttryck motsvarar $number = 10 + 20 - 50.

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

2.3 Token

Syntax:

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

Beskrivning:

En token är det minsta lexikala elementet i PowerShell-språket.

Token kan avgränsas med radrader, kommentarer, blanksteg eller en kombination av dessa.

2.3.1 Nyckelord

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

Beskrivning:

Ett nyckelord är en sekvens med tecken som har en särskild betydelse när det används på en kontextberoende plats. Oftast är detta som den första token i en -instruktion. Det finns dock andra platser, vilket anges av grammatiken. (En token som ser ut som ett nyckelord, men som inte används i en nyckelordskontext, är ett kommandonamn eller ett kommando-argument.)

Nyckelorden class, define, from, usingoch är var reserverade för framtida användning.

Anteckning

Kommentar från redigeraren: Nyckelorden class och using introducerades i PowerShell 5.0. Se about_Classes och about_Using.

2.3.2 Variabler

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

Beskrivning:

Variabler beskrivs i detalj i (–5). Variabeln $? beskrivs i .2.3.2.2. Omfång beskrivs i -3.5.

Variablerna och $$ är $^ reserverade för användning i en interaktiv miljö som ligger utanför omfånget för den här specifikationen.

Det finns två sätt att skriva ett variabelnamn: Ett klamerat variabelnamn ,$ som börjar med följt av en klammerparentes med ett eller flera nästan godtyckliga tecken, och ett vanligt variabelnamn ,$ som också börjar med , följt av en uppsättning med ett eller flera tecken från en mer begränsande uppsättning än ett klamerat variabelnamn tillåter. Varje vanligt variabelnamn kan uttryckas med ett motsvarande kparenat variabelnamn.

$totalCost
$Maximum_Count_26

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

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

Det finns ingen gräns för längden på ett variabelnamn, alla tecken i ett variabelnamn är signifikanta och bokstavsfallet är inte distinkt.

Det finns flera olika typer av variabler: användardefinierade (2.3.2.1), automatiska (2.3.2.2) och inställningar (2.3.2.3). De kan alla samexistera i samma omfång (3,5).

Överväg följande funktionsdefinition och anrop:

function Get-Power ([long]$base, [int]$exponent) { ... }

Get-Power 5 3 # $base is 5, $exponent is 3
Get-Power -exponent 3 -base 5 # " " "

Varje argument skickas med position eller namn, ett i taget. En uppsättning argument kan dock skickas som en grupp med expansion till enskilda argument som hanteras av körningsmiljön. Den här automatiska argumentexpansionen kallas för splatting. Exempel:

$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

Detta uppnås genom att använda @ i stället för $ som det första tecknet i variabeln som skickas. Den här notationen kan bara användas i ett argument till ett kommando.

Namn partitioneras i olika namnrymder som var och en lagras på en virtuell enhet (3.1). Variabler lagras till exempel på Variable:, miljövariabler lagras på , Function:funktioner lagras på och alias lagras Env:Alias:. Alla dessa namn kan nås som variabler med hjälp av variabelnamnrymdsproduktion inom variabelomfång. Exempel:

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

All användning av ett variabelnamn med ett explicit Variable: namnområde motsvarar användningen av samma variabelnamn utan den kvalificeringen. Till exempel och $v är $Variable:v utbytbara.

Förutom att de definieras i språket kan variabler också definieras av cmdleten New-Variable.

2.3.2.1 Användardefinierade variabler

Alla variabelnamn som tillåts av grammatiken men som inte används av automatiska variabler eller inställningsvariabler är tillgängliga för användardefinierade variabler.

Användardefinierade variabler skapas och hanteras av användardefinierade skript.

2.3.2.2 Automatiska variabler

Automatiska variabler lagrar tillståndsinformation om PowerShell-miljön. Deras värden kan läsas i användarskrivna skript men inte skrivas.

Anteckning

Tabellen som ursprungligen fanns i det här dokumentet har tagits bort för att minska dupliceringen. En fullständig lista över automatiska variabler finns i about_Automatic_Variables.

2.3.2.3 Inställningsvariabler

Inställningsvariabler lagrar användarinställningar för sessionen. De skapas och initieras av PowerShell-körningsmiljön. Deras värden kan läsas och skrivas i användarskrivna skript.

Anteckning

Tabellen som ursprungligen fanns i det här dokumentet har tagits bort för att minska dupliceringen. En fullständig lista över inställningsvariabler finns i about_Preference_Variables.

2.3.3 Kommandon

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 Parametrar

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

Beskrivning:

När ett kommando anropas kan information skickas till det via ett eller flera argument vars värden nås inifrån kommandot via en uppsättning motsvarande parametrar. Processen för att matcha parametrar till argument kallas parameterbindning.

Det finns tre typer av argument:

  • Växlingsparametern (·8.10.5) – Den har formen command-parameter där first-parameter-char och parameter-chars tillsammans utgör växelnamnet, vilket motsvarar namnet på en parameter ( -utan dess inledande ) i kommandot som anropas. Om det avslutande kolonet utelämnas indikerar förekomsten av det här argumentet att motsvarande parameter anges till $true. Om det avslutande kolonet finns måste argumentet omedelbart efter ange ett värde av typen bool, och motsvarande parameter anges till det värdet. Följande anrop är till exempel likvärdiga:

    Set-MyProcess -Strict
    Set-MyProcess -Strict: $true
    
  • Parameter med argument (·8.10.2) – Det här har formuläret command-parameter där first-parameter-char och parameter-chars tillsammans utgör parameternamnet, som motsvarar namnet på en parameter (utan dess inledande -) i kommandot som anropas. Det får inte finnas något avslutande kolon. Argumentet omedelbart efter anger ett associerat värde. Om du till exempel har kommandot Get-Power, som har parametrar $base $exponentoch , är följande anrop likvärdiga:

    Get-Power -base 5 -exponent 3
    Get-Power -exponent 3 -base 5
    
  • Positionsargument (·8.10.2) – Argument och deras motsvarande parametrar i kommandon har positioner där den första har position noll. Argumentet i position 0 är bundet till parametern på position 0. argumentet i position 1 är bundet till parametern på position 1; och så vidare. Om du till exempel har Get-Powerkommandot , $base $exponent som har parametrarna och i positionerna 0 respektive 1, anropar följande det kommandot:

    Get-Power 5 3
    

Mer information om de särskilda parametrarna och finns i -- --%.8.2.

När ett kommando anropas kan ett parameternamn förkortas. alla distinkta inledande delar av det fullständiga namnet kan användas, förutsatt att är entydig med avseende på namnen på de andra parametrarna som accepteras av samma kommando.

Information om parameterbindning finns i .8.14.

2.3.5 literaler

Syntax:

literal:
    integer-literal
    real-literal
    string-literal

2.3.5.1 Numeriska literaler

Det finns två typer av numeriska literaler: heltal (·2.3.5.1.1) och verkliga (·2.3.5.1.2). Båda kan ha multiplikationssuffix (2.3.5.1.3).

2.3.5.1.1 Heltalslitteraler

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

Beskrivning:

Typen av en heltalslitteral bestäms av dess värde, förekomsten eller frånvaron av long-type-suffix och förekomsten av en numerisk multiplikator (medier (2.3.5.1.3).

För en heltalslitteral utan long-type-suffix

  • Om dess värde kan representeras av typen int (–4.2.3) är det dess typ;
  • Om dess värde annars kan representeras av typen long (–4.2.3) är det dess typ.
  • Om dess värde annars kan representeras av typen decimal (–2.3.5.1.2) är det dess typ.
  • Annars representeras den av typen double (2.3.5.1.2).

För en heltalslitteral med long-type-suffix

  • Om dess värde kan representeras av typen long (–4.2.3) är det dess typ;
  • Annars är den literalen dåligt utformad.

I tvåor kompletterar representationen av heltalsvärden finns det ett mer negativt värde än det är positivt. För int-typen är det extra värdet -2147483648. För den långa typen är det extra värdet -9223372036854775808. Även om token 2147483648 normalt skulle behandlas som en literal av typen long, om den föregås omedelbart av den enära operatorn – behandlas operatorn och literalen som en literal av typen int som har det minsta värdet. Även om token 9223372036854775808 normalt skulle behandlas som en verklig literal av typen decimal, behandlas operatorn och literalen som en literal av typen länge med det minsta värdet, även om token 9223372036854775808 normalt skulle behandlas som en literal av typen decimal.

Några exempel på heltalslitteraler är 123 (int), 123L (long) och 20000000000 (long).

Det finns inget som heter en heltalslitteral av typen byte.

2.3.5.1.2 Verkliga literaler

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)

Beskrivning:

En verklig literal kan innehålla en numerisk multiplikator (#2.3.5.1.3).

Det finns två typer av verkliga literaler: dubbel och decimal. Dessa anges med frånvaron eller förekomsten av decimal-type-suffix. (Det finns inget som heter flyttal verklig literal.)

En dubbel verklig literal har typen double (4.2.4.1). En decimal verklig literal har typen decimal (–4.2.4.2). Avslutande nollor i bråkdelen av en verklig decimallitteral är signifikanta.

Om värdet för exponentdels decimalsiffror i en dubbel verklig literal är mindre än det minsta som stöds är värdet för den dubbla verkliga literalen 0. Om värdet för exponentdels decimalsiffror i en verklig decimallitteral är mindre än det minsta som stöds är den literalen inte lika stor. Om värdet för exponent-delens decimalsiffror i en verklig dubbel- eller decimallitteral är större än det högsta som stöds, är den literalen inte utformad.

Några exempel på dubbla verkliga literaler är 1., 1.23, .45e35, 32.e+12 och 123.456E-231.

Några exempel på verkliga decimallitteraler är 1d (som har skala 0), 1,20d (som har skala 2), 1,23450e1d (dvs. 12,3450, som har skala 4), 1,2345e3d (dvs. 1234.5, som har skala 1), 1,2345e-1d (t.ex. 0,12345, som har skala 5) och 1,2345e-3d (dvs. 0,0012345, som har skala 7).

Anteckning

Eftersom en dubbel verklig literal inte behöver ha en fraktion eller exponentdel grupperas parenteserna i (123). M krävs för att säkerställa att egenskapen eller metoden M väljs för det heltalsobjekt vars värde är 123. Utan dessa parenteser skulle den verkliga literalen vara dåligt utformad.

Anteckning

Även om PowerShell inte tillhandahåller literaler för infiniteter och NaN kan dubbla verkliga literalliknande motsvarigheter hämtas från statiska skrivskyddade egenskaper PositiveInfinity, NegativeInfinity och NaN av typerna flyttal och dubbla (4.2.4.1).

Grammatiken tillåter att det som börjar som en dubbel verklig literal har ett l - eller - L typsuffix. En sådan token är egentligen en heltalslitteral vars värde representeras av typen long.

Anteckning

Den här funktionen har behålls för bakåtkompatibilitet med tidigare versioner av PowerShell. Programmerare avråds dock från att använda heltalslitteraler av det här formuläret eftersom de enkelt kan dölja literalens faktiska värde. 1.2L har till exempel värdet 1, 1,2345e1L har värdet 12 och 1,2345e-5L har värdet 0, och inget av dem är omedelbart uppenbart.

2.3.5.1.3 Multiplikationssuffix

Syntax:

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

Beskrivning:

För enkelhetens skull kan heltal och verkliga literaler innehålla en numerisk multiplikator, vilket indikerar en av en uppsättning vanliga överheterna 10. numerisk multiplikator kan skrivas i valfri kombination av versaler eller gemener.

Multiplikator Innebörd Exempel
Kb kilobyte (1024) 1 kb ≡ 1024
Mb megabyte (1 024 x 1 024) 1,30Dmb ≡ 1363148.80
Gb gigabyte (1 024 x 1 024 x 1 024) 0x10 Gb ≡ 17179869184
Tb terabyte (1 024 x 1 024 x 1 024 x 1 024) 1.4e23tb ≡ 1.5393162788864E+35
Pb petabyte (1 024 x 1 024 x 1 024 x 1 024 x 1 024) 0x12Lpb ≡ 20266198323167232

2.3.5.2 Stränglitteraler

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 @

Beskrivning:

Det finns fyra typer av stränglitteraler:

  • verbatim-string-literal (enradig enkelcitat), som är en sekvens med noll eller flera tecken avgränsade med ett par enkla citattecken. Exempel är "" och "röd".

  • expandable-string-literal (single-line double-quoted), som är en sekvens med noll eller flera tecken avgränsade med ett par med dubbla citattecken. Exempel är "" och "röd".

  • verbatim-here-string-literal (multi-line single-quoted), som är en sekvens med noll eller flera tecken som avgränsas av teckenparen @single-quote-character respektive single-quote-character@, som alla finns på två eller flera källrader. Några exempel:

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • expandable-here-string-literal (multi-line double-quoted), som är en sekvens med noll eller flera tecken som avgränsas av teckenparen @double-quote-character respektive double-quote-character@, som alla finns på två eller flera källrader. Några exempel:

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

För ordagranna-här-sträng-literaler och expanderbara-här-sträng-literaler, förutom blanksteg (som ignoreras) får inga tecken följa på samma källrad som det inledande avgränsarteckenparet, och inga tecken får föregås av samma källrad som det avslutande avgränsarteckenparet.

Brödtexten i en ordagrann-här-sträng-literal eller expandable-here-string-literal börjar i början av den första källraden efter den inledande avgränsaren och slutar i slutet av den sista källraden före den avslutande avgränsaren. Brödtexten kan vara tom. Radavgränsaren på den sista källraden före den avslutande avgränsaren är inte en del av den literalens brödtext.

En literal av någon av dessa typer har en typsträng (4.3.1).

Det tecken som används för att avgränsa en ordagrann sträng-literal eller expandable-string-literal kan finnas i en sådan stränglitteral genom att skriva det tecknet två gånger i följd. Exempelvis 'What''s the time?' och "I said, ""Hello"".". Ett enkelt citattecken har dock ingen särskild betydelse i en expanderbar sträng-literal, och ett dubbelt citattecken har ingen särskild betydelse inuti en ordagrann sträng-literal.

En expandable-string-literal och en expandable-here-string-literal kan innehålla "escaped-characters" (2.3.7). När till exempel följande stränglitteral skrivs till pipelinen visas resultatet enligt nedan:

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

Om en expandable-string-literal eller expandable-here-string-literal innehåller namnet på en variabel, såvida inte namnet föregås omedelbart av ett escape-tecken, ersätts det av strängrepresentationen av variabelns värde (6,7). Detta kallas variabelersättning.

Anteckning

Om variabelnamnet är en del av ett större uttryck ersätts bara variabelnamnet. Om till exempel är $a en matris som innehåller elementen 100 och 200 resulterar ">$a.Length<" det i >100 200.Length< medan ">$($a.Length)<" resulterar i >2<. Se expansion av underuttryck nedan.

Till exempel källkoden

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

resulterar i expandable-string-literal

The value of $count is 10.

Tänk också på följande:

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

Då är resultatet följande

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

expandable-string-literals och expandable-here-string-literals stöder också en typ av ersättning som kallas subuttrycksexpansion, genom att behandla texten $( ... ) i formuläret som ett underuttryck (!)7.1.6). Sådan text ersätts av strängrepresentationen av uttryckets värde (6,8). Alla blanksteg som används för att avgränsa token i underuttryckets instruktionslista ignoreras när det gäller resultatsträngens konstruktion.

Exemplen,

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

resulterar i följande expanderbara sträng-literaler:

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

Följande källa:

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

resulterar i följande expanderbara-string-literal:

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

Dessa fyra rader kunde ha skrivits mer kortfattat på följande sätt:

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

I följande exempel:

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

den resulterande expanderbara sträng-literalen är följande:

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

Som du ser kan ett underuttryck innehålla stränglitteraler som har både variabelersättning och subuttrycksexpansion. Observera också att avgränsarna för den inre expanderbara sträng-literalen inte behöver hoppas över. det faktum att de finns i ett underuttryck innebär att de inte kan vara terminatorer för den yttre expanderbara sträng-literalen.

En expandable-string-literal eller expandable-here-string-literal som innehåller en variabelersättning eller subuttrycksexpansion utvärderas varje gång som literalen används. till exempel

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

vilket resulterar i följande expanderbara sträng-literaler:

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

Innehållet i en ordagrann-här-sträng-literal tas ordagrann, inklusive eventuella inledande eller avslutande blanksteg i brödtexten. Därför behöver inbäddade enkla citattecken inte fördubblas och det finns ingen ersättning eller expansion. Exempel:

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

vilket resulterar i literalen

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

Innehållet i en expanderbar-här-sträng-literal kan ersätta och expanderas, men eventuella inledande eller avslutande blanksteg i brödtexten men utanför eventuella underuttryck tas ordagranna, och inbäddade dubbla citattecken behöver inte dubblera upp. Exempel:

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

vilket resulterar i följande literal när den expanderas:

That's it!
2 * 3 = 6

För både ordagranna-här-sträng-literaler och expandable-here-string-literals representeras varje radparenterator i brödtexten i den resulterande literalen på ett implementeringsdefinierat sätt. I till exempel

$lit = @"
abc
xyz
"@

den andra raden i brödtexten har två inledande blanksteg, och den första och andra raden i brödtexten har radterminatorer; Men terminatorn för den andra raden i brödtexten är inte en del av den brödtexten. Den resulterande literalen motsvarar: "abc<implementation-defined character sequence>xyz".

Anteckning

För att underlätta läsbarheten för källan kan långa stränglitteraler brytas över flera källrader utan att radterminatorer infogas. Detta görs genom att skriva varje del som en separat literal och sammanfoga delarna med operatorn +(7.7.2). Med den här operatorn kan operanderna ange någon av de fyra typerna av stränglitteraler.

Anteckning

Även om det inte finns något sådant som en teckenlitteral i sig, kan samma effekt uppnås genom att komma åt det första tecknet i en sträng med 1 tecken, enligt följande: [char]"A" eller "A"[0].

För både ordagranna-här-sträng-literaler och expandable-here-string-literals representeras varje radparenterator i brödtexten exakt som den angavs.

2.3.5.3 Null-literal

Se variabeln automatic $null (!)2.3.2.2).

2.3.5.4 Booleska literaler

Se de automatiska variablerna $false och $true (!)2.3.2.2).

2.3.5.5 Matrislitteraler

Med PowerShell kan uttryck av matristyp (·9) skrivas med den enära kommaoperatorn (·7.2.1), array-expression (·7.1.7), den binära kommaoperatorn (·7.3) och intervalloperatorn (·7.4).

2.3.5.6 Hash-literaler

Med PowerShell kan uttryck av typen Hashtable (·10) skrivas med ett hash-literal-expression (·7.1.9)

2.3.5.7 Typnamn

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 Operatorer och skiljetecken

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

Beskrivning:

&& och || är reserverade för framtida användning.

Anteckning

Redigerares kommentar: Operatorerna för pipelinekedjan && och || introducerades i PowerShell 7. Se about_Pipeline_Chain_Operators.

Namnet efter bindestreck i en operator är reserverat för detta ändamål endast i en operatorkontext.

En operator som börjar med bindestreck får inte ha något tomt utrymme mellan bindestrecket och den token som följer efter.

2.3.7 Utrymda tecken

Syntax:

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

Beskrivning:

Ett rymt tecken är ett sätt att tilldela en särskild tolkning av ett tecken genom att ge det prefixet Backtick (U+0060). I följande tabell visas innebörden av varje överspelade tecken:

Utrymt tecken Innebörd
`a Avisering (U+0007)
`b Backspace (U+0008)
`f Formulärflöde (U+000C)
`n Ny rad (U+000A)
`r Vagnretur (U+000D)
`t Vågrät flik (U+0009)
`v Lodrät flik (U+0009)
`' Enkelt citattecken (U+0027)
`" Dubbelt citattecken (U+0022)
`` Bakåtklick (U+0060)
`0 NUL (U+0000)
`x Om x är ett annat tecken än de tecken som visas ovan ignoreras bakåtklickstecknet och tas bokstavligen x .

Konsekvenserna av den sista posten i tabellen ovan är att blanksteg som annars skulle separera token kan ingå i en token i stället. Ett filnamn som innehåller ett blanksteg kan till exempel skrivas som Test` Data.txt (samt 'Test Data.txt' eller "Test Data.txt").