Dela via


2. Lexikal struktur

Redaktionell anteckning

Viktig

Windows PowerShell Language Specification 3.0 publicerades i december 2012 och baseras på Windows PowerShell 3.0. Den här specifikationen återspeglar inte det aktuella tillståndet för PowerShell. Det finns ingen plan för att uppdatera den här dokumentationen för att återspegla det aktuella tillståndet. Den här dokumentationen presenteras här för historisk referens.

Specifikationsdokumentet är tillgängligt som ett Microsoft Word dokument från Microsoft Download Center på: https://www.microsoft.com/download/details.aspx?id=36389 Det Word dokumentet har konverterats för presentation här på Microsoft Learn. Under konverteringen har vissa redaktionella ändringar gjorts för att anpassa formateringen för Docs-plattformen. Vissa stavfel och mindre fel har korrigerats.

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 radavgränsare, kommentarer, blanksteg och tokens. Den syntaktiska grammatiken (§B.2) visar hur tokenen 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 tecknena "a" till "z" i grammatiken är skiftlägesokänslig. Det innebär att bokstavsfall i variabler, alias, funktionsnamn, nyckelord, instruktioner och operatorer ignoreras. I den här specifikationen skrivs dock sådana namn i gemener, med undantag för vissa automatiska variabler och inställningsvariabler.

2.2 Lexikal analys

2.2.1 Skript

Syntax:

Tips

Den ~opt~ notationen 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:

Inmatningsströmmen till en PowerShell-översättare är indata i ett skript, som innehåller en sekvens med Unicode-tecken. Den lexikala bearbetningen av den här strömmen innebär att dessa tecken reduceras till en sekvens av token, som fortsätter att bli indata för syntaktisk analys.

Ett skript är en grupp PowerShell-kommandon som lagras i en skriptfil. Själva skriptet har inget namn i sig och tar namnet från källfilen. Slutet av filen anger slutet på 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 Radavgränsare

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 i indatakällan delar upp den i rader som kan användas för till exempel felrapportering och identifiering av slutet av en kommentar med en rad.

En linjeavgränsare 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ällkod kan kommenteras med hjälp av kommentarer.

En enradskommentar börjar med tecknet # och slutar med ett nytt radtecken.

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

En kommentar behandlas som tomt utrymme.

Ovanstående produktioner innebär att

  • Kommentarer kapslas inte.
  • Teckensekvenserna <# och #> har inte någon särskild betydelse i en enradig kommentar.
  • Tecknet # har ingen särskild betydelse i en avgränsad kommentar.

Den lexikala grammatiken innebär att kommentarer inte kan ske inuti token.

(Se §A för information om hur du skapar skriptfiler som innehåller specialvärdeskommentare som används för att generera dokumentation från skriptfiler.)

En med en obligatorisk kommentar anger de kriterier som måste uppfyllas för att det innehållande skriptet ska få köras. Det primära kriteriet är den version av PowerShell som används för att köra skriptet. Minimikravet för version anges på följande sätt:

#Requires -Version N[.n]

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

En kräver kommentar kan finnas i valfri skriptfil. 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 anses hello#there vara en enstaka token medan hello #there anses vara token hello följt av en enradig kommentar. Förutom efter blanksteg kan kommentarens startsekvens också föregås av ett tecken som avslutar ett uttryck eller en sats (till exempel ), }, ], ', "eller ;).

En med kommentar kan inte finnas i en snap-in-modul.

Det finns fyra andra former av en kräver-kommentar:

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

2.2.4 Mellanrum

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 blanksteg tecken.

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

Till skillnad från vissa populära språk anser PowerShell inte att radbrytningstecken (§2.2.2) är blanksteg. En radavgränsare kan dock behandlas som tomt utrymme genom att omedelbart föregå den med ett backtick-tecken, ` (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. Till 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 betecknar backticken att källraden fortsätter. 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 nya rader, kommentarer, blanksteg eller valfri 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, som grammatiken visar. (En token som ser ut som ett nyckelord, men som inte används i en nyckelordskontext, är ett kommandonamn eller ett kommandoargument.)

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

Not

Redigerarens anmärkning: Nyckelorden class och using introducerades i PowerShell 5.0. Se om_klasser och om_användning.

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 $? diskuteras i §2.3.2.2. Omfång diskuteras i §3.5.

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

Det finns två sätt att skriva ett variabelnamn: Ett klammerparenteserat variabelnamn, som börjar med $, följt av en klammerparentesavgränsad uppsättning 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 restriktiv uppsättning än vad ett klammerparenteserat variabelnamn tillåter. Varje vanligt variabelnamn kan uttryckas med ett motsvarande klammerparenteserat 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 betydande och bokstavsfallet är inte distinkt.

Det finns flera olika typer av variabler: användardefinierade (§2.3.2.1), automatisk (§2.3.2.2), och preferens (§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 genom position eller namn, ett i taget. En uppsättning argument kan dock skickas som en grupp där uppdelningen till enskilda argument hanteras av körningsmiljön. Den här automatiska argumentexpansionen kallas splatting. Till 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 för variabeln som skickas. Den här notationen kan endast användas i ett argument till ett kommando.

Namnen partitioneras i olika namnområden som var och en lagras på en virtuell enhet (§3.1). Variabler lagras till exempel på Variable:, miljövariabler lagras på Env:, funktioner lagras på Function:och alias lagras på Alias:. Alla dessa namn kan användas som variabler med hjälp av variabelnamnområde produktion inom . Till 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 är $v och $Variable:v utbytbara.

Förutom att definieras på 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.

Not

Tabellen som ursprungligen hittades i det här dokumentet togs 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.

Not

Tabellen som ursprungligen hittades i det här dokumentet togs 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 en 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:

  • [switch] parameter (§8.10.5) – Detta har formuläret 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 anger förekomsten av det här argumentet att motsvarande parameter är inställd på $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 kommandoparameter där first-parameter-char och parameter-chars tillsammans utgör parameternamnet, vilket motsvarar namnet på en parameter (utan dess inledande -) i kommandot som anropas. Det får inte finnas något avslutande kolon. Argumentet som följer omedelbart anger ett associerat värde. Med ett kommando Get-Power, som har parametrar $Base och $Exponent, är till exempel 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 inuti kommandon har positioner där den första har position noll. Argumentet i position 0 är bundet till parametern i position 0. argumentet i position 1 är bundet till parametern i position 1. och så vidare. Med ett kommando Get-Power, som till exempel har parametrar $Base och $Exponent i position 0 respektive 1, anropar följande kommando det kommandot:

    Get-Power 5 3
    

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

När ett kommando anropas kan ett parameternamn förkortas. varje distinkt inledande del av det fullständiga namnet får användas, förutsatt att det är entydigt med avseende på namnen på de andra parametrar som godkänts 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 suffix för multiplikator (§2.3.5.1.3).

2.3.5.1.1 Heltalsliteraler

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 hexadecimal-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 heltalsliteral bestäms av dess värde, förekomsten eller frånvaron av långtypssuffixoch förekomsten av en numerisk multiplikator (§2.3.5.1.3).

För en heltalssiffra utan långtypssuffix

  • Om dess värde kan representeras av typ int (§4.2.3), är det dess typ;
  • Annars, om dess värde kan representeras av typen long (§4.2.3), är det dess typ.
  • Annars, om dess värde 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 heltalsliteral med suffix av lång typ

  • Om dess värde kan representeras av typen long (§4.2.3), är det dess typ;
  • Annars är literalen felaktigt formad.

I tvåkompletteringsrepresentationen 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, behandlas operatorn och literalen tillsammans som en literal av typen int med det minsta värdet ifall den omedelbart föregås av den unära - operatorn. På samma sätt, även om token 9223372036854775808 normalt skulle behandlas som en verklig literal av typen decimal, om den omedelbart föregås av den unary - operatorn, behandlas operatorn och literalen som en literal av typen long med det minsta värdet.

Några exempel på heltalsliteraler är 123 (int), 123L (lång) och 200000000000 (lång).

Det finns inget som heter en heltalsliteral 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 reell literal: double och decimal. Dessa indikeras antingen av frånvaron eller närvaron av decimaltyp-suffix. (Det finns inget sådant som en flyttalsliteral.)

En dubbel verklig literal har typ dubbel (§4.2.4.1). En decimalformigt realt tal har typen decimal (§4.2.4.2). Avslutande nollor i bråkdelen av en verklig decimalliteral är betydande.

Om värdet för exponentdel's decimaltal 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 exponentdel's decimaltal i en decimal verklig literal är mindre än det minsta som stöds, är den literalen dåligt utformad. Om värdet för exponentdel's decimal-siffror i en dubbel eller decimal verklig literal är större än det maximala som stöds, är den literalen dåligt 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 decimalliteraler är 1d (som har skala 0), 1,20d (som har skalning 2), 1,23450e1d (dvs. 12,3450, som har skala 4), 1,2345e3d (dvs. 1234.5, som har skalning 1), 1.2345e-1d (dvs. 0.12345, som har skalning 5) och 1.2345e-3d (dvs. 0.0012345, som har skalning 7).

Not

Eftersom en dubbel literal inte behöver ha en bråkdel eller exponentdel, behövs parenteserna i (123).M 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.

Not

Även om PowerShell inte tillhandahåller literaler för infiniteter och NAN, kan dubbla verkliga literalliknande motsvarigheter erhållas från de statiska skrivskyddade egenskaperna PositiveInfinity, NegativeInfinity och NaN av typerna float och double (§4.2.4.1).

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

Not

Den här funktionen har bevarats för bakåtkompatibilitet med tidigare versioner av PowerShell. Programmerare avråder dock från att använda heltal i det här formuläret eftersom de enkelt kan dölja literalens faktiska värde. Till exempel har 1.2L värde 1, 1.2345e1L har värdet 12 och 1.2345e-5L har värdet 0, varav inget är omedelbart uppenbart.

2.3.5.1.3 Multiplikatorsuffix

Syntax:

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

Beskrivning:

För enkelhetens skull kan heltal och reella literaler innehålla en numerisk multiplikator, vilken indikerar en av de vanligt använda potenserna av 10. numerisk multiplikator kan skrivas i valfri kombination av stora eller små bokstäver.

Multiplikator betydelse Exempel
Kb kilobyte (1 024) 1kb ≡ 1024
mb megabyte (1 024 x 1 024) 1.30Dmb ≡ 1363148.80
Gb gigabyte (1 024 x 1 024 x 1 024) 0x10Gb ≡ 17179869184
tbc 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ängliteraler

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ängliteraler:

  • verbatim-string-literal (enkelrads-single-quoted), som är en sekvens med noll eller fler tecken avgränsade av ett par tecken. Exemplen är "" och "röd".

  • expandable-string-literal (enkelradig dubbelciterad), som är en sekvens med noll eller fler tecken avgränsade med ett par dubbelcitatteckens. Exemplen är "" och "röd".

  • verbatim-here-string-literal (multi-line single-quoted), som är en sekvens med noll eller fler tecken avgränsade av teckenparen @enstaka citattecken och enstaka citattecken@, alla innehållna på två eller fler källrader. Exempel är:

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • expandable-here-string-literal (multi-line double-quoted), som är en sekvens av noll eller fler tecken avgränsad av teckenparen @dubbelcitattecken och dubbelcitattecken@, helt och hållet placerad på två eller fler källrader. Exempel är:

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

För verbatim-here-string-literals och expandable-here-string-literals, 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å på samma källrad som det avslutande avgränsarteckenparet.

Den brödtexten av en verbatim-here-string-literal eller en 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. Kroppen 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 typsträng (§4.3.1).

Tecknet som används för att avgränsa en verbatim-string-literal eller expandable-string-literal kan ingå i en sådan strängliteral genom att skriva det tecknet två gånger, i följd. Till exempel 'What''s the time?' och "I said, ""Hello"".". Det dock att ett enkel-citattecken har ingen särskild betydelse i en expanderbar strängliteral, och ett dubbel-citattecken har ingen särskild betydelse i en ordagrann strängliteral.

En expandable-string-literal och en expandable-here-string-literal kan innehålla escape-characters (§2.3.7). När till exempel följande strängliteral 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 omedelbart föregås av ett escape-tecken, ersätts det av strängrepresentationen av variabelns värde (§6.7). Detta kallas variabel ersättning.

Not

Om variabelnamnet är en del av ett större uttryck ersätts endast variabelnamnet. Om $a till exempel är en matris som innehåller elementen 100 och 200 resulterar ">$a.Length<" 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 expanderbar-sträng-literal

The value of $count is 10.

Tänk på följande:

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

Resultatet är

$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 underuttrycksexpansion, genom behandling av text i formen $( ... ) 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 separera token i underuttryckinstruktionslista 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 expandable-string-literals:

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 expandable-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 expandable-string-literal ä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 visas kan ett underuttryck innehålla strängliteraler med både variabelsubstitution och expansion av underuttryck. Observera också att avgränsarna för den inre expanderbara strängliteraleninte behöver undkommas. Det faktum att de finns i ett underuttryck innebär att de inte kan vara avslutare för den yttre expanderbara strängliteralen.

En expandable-string-literal eller expandable-here-string-literal som innehåller en variabel substitution eller underuttrycksexpansion utvärderas varje gång som literal 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 expandable-string-literals:

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

Innehållet i en verbatim-here-string-literal tas ordagrant, inklusive alla inledande eller avslutande blanksteg i brödtexten. Därför behöver inte inbäddade enkelcitatsteckendubbleras, och det finns ingen ersättning eller expansion. Till exempel

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

vilket resulterar i den bokstavliga betydelsen

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

Innehållet i en expanderbar-här-strängliteral är föremål för ersättning och expansion, men alla inledande eller avslutande blanksteg i brödtexten men utanför alla underuttrycks tas ordagrant, och inbäddade dubbelcitatteckenbehöver inte dubbleras. Till exempel

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

vilket resulterar i följande bokstavliga betydelse när det expanderas:

That's it!
2 * 3 = 6

För både verbatim-here-string-literals och expandable-here-string-literals representeras varje radavslutare i texten i den resulterande literalen på ett sätt som definieras av implementationen. Till exempel i

$lit = @"
abc
xyz
"@

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

Not

För att underlätta källans läsbarhet kan långa strängliteraler brytas över flera källlinjer utan att radavgränsare 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 dess operander ange någon av de fyra typerna av stränglitral.

Not

Även om det inte finns något sådant som en teckenliteral 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 verbatim-here-string-literals och expandable-here-string-literals representeras varje radavgränsare i brödtexten exakt som den angavs.

2.3.5.3 Nullliteral

Se den automatiska variabeln $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 Arrayliteraler

PowerShell tillåter att uttryck av matristyp (§9) skrivs med kommaoperatorn (§7.2.1), matrisuttryck (§7.1.7), den binära kommaoperatorn (§7.3), och rangeoperatorn (§7.4).

2.3.5.6 Hashlitraler

PowerShell tillåter att uttryck av typen Hashtable (§10) skrivs 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 Operatörer 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.

Not

Redigerarens anmärkning: Pipelinekedjeoperatorerna && och || introducerades i PowerShell 7. Se about_Pipeline_Chain_Operators.

Namnet som följer bindestreck i en operatör är reserverat enbart för detta syfte i en operatörskontext.

En operator som börjar med streck får inte ha något tomt utrymme mellan det strecket och den token som följer den.

2.3.7 Undantagna tecken

Syntax:

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

Beskrivning:

Ett särskilt tecken är ett sätt att tilldela en särskild tolkning till ett tecken genom att ge det ett backtick-tecken (U+0060) som prefix. Följande tabell visar innebörden av varje flykttecken:

Undantaget tecken Betydelse
`a Avisering (U+0007)
`b Backspace (U+0008)
`f Formulärfeed (U+000C)
`n Ny rad (U+000A)
`r Vagnretur (U+000D)
`t Horisontell tabb (U+0009)
`v Lodrät flik (U+0009)
`' Enkelt citattecken (U+0027)
`" Dubbelt citattecken (U+0022)
`` Bakåtsnedstreck (U+0060)
`0 NUL (U+0000)
`x Om x är ett annat tecken än de tecken som visas ovan ignoreras backtick-tecknet och x tas bokstavligen.

Konsekvensen av den sista posten i tabellen ovan är att blanksteg som annars skulle separera token kan göras till en del av 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").