次の方法で共有


2. 字句構造

編集メモ

重要

Windows PowerShell 言語仕様 3.0 は、2012 年 12 月に公開され、Windows PowerShell 3.0 に基づいています。 この仕様では、PowerShell の現在の状態は反映されません。 現在の状態を反映するようにこのドキュメントを更新する予定はありません。 このドキュメントは、履歴参照のためにここに示されています。

仕様文書は、Microsoft ダウンロード センターから Microsoft Word 文書として入手できます。https://www.microsoft.com/download/details.aspx?id=36389 Word 文書は、Microsoft Learn でプレゼンテーション用に変換されています。 変換中に、Docs プラットフォームの書式設定に対応するために、いくつかの編集の変更が行われました。 一部の入力ミスと軽微なエラーが修正されました。

2.1 文法

この仕様では、2 つの文法を使用した PowerShell 言語の構文を示します。 字句文法 (§B.1) は、Unicode 文字を組み合わせて行終端記号、コメント、空白、トークンを形成する方法を示しています。 構文文法 (§B.2) は、構文文法から得られるトークンを組み合わせて PowerShell スクリプトを形成する方法を示しています。

便宜上、これらの文法のフラグメントは、この仕様全体を通じて適切な場所にレプリケートされます。

文法上、文字 'a' から 'z' の使用は大文字と小文字が区別されません。 つまり、変数、エイリアス、関数名、キーワード、ステートメント、および演算子の大小文字は無視されます。 ただし、この仕様全体を通じて、このような名前は、一部の自動変数と基本設定変数を除き、小文字で記述されます。

2.2 字句解析

2.2.1 スクリプト

構文:

ヒント

構文定義の ~opt~ 表記は、構文エンティティが構文で省略可能であることを示します。

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

説明

PowerShell トランスレーターへの入力ソース ストリームは、一連の Unicode 文字を含むスクリプト内の 入力 です。 このストリームの字句処理には、これらの文字を一連のトークンに減らすことが含まれ、構文分析の入力になります。

スクリプトは、スクリプト ファイルに格納されている PowerShell コマンドのグループです。 スクリプト自体には名前がなく、ソース ファイルからその名前を取得します。 そのファイルの末尾は、スクリプトの末尾を示します。

スクリプトには、必要に応じてデジタル署名を含めることができます。 ホスト環境では、署名に続くテキストや署名のようなテキストを処理する必要はありません。 デジタル署名の作成と使用については、この仕様では説明しません。

2.2.2 ラインターミネータ

構文:

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

説明:

改行文字が入力ソースストリームに存在することで、エラー報告や1行コメントの末尾検出などに利用できる行に分割されます。

行ターミネータは空白 (§2.2.4) として扱うことができます。

2.2.3 コメント

構文:

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 #

説明:

ソース コードは、コメント使用することで注釈を付けることができます。

の単一行コメント は、文字 # で始まり、改行文字で終わります。

区切りコメント は、文字ペア <# で始まり、文字ペア #>で終わります。 ソース行の一部として、ソース行全体として発生することも、任意の数のソース行にまたがる場合もあります。

コメントは空白として扱われます。

上記の生成においては、

  • コメントは入れ子になりません。
  • #と #><文字シーケンスは、1 行のコメントでは特別な意味を持っていません。
  • 文字 # は、区切られたコメントでは特別な意味を持っていません。

字句文法は、トークン内でコメントを作成できないことを意味します。

(スクリプト ファイルからドキュメントを生成するために使用される特別な値のコメントを含むスクリプト ファイルの作成については、§A を参照してください)。

requires-comment は、その包含スクリプトの実行を許可するために満たす必要がある条件を指定します。 主な条件は、スクリプトの実行に使用される PowerShell のバージョンです。 最小バージョン要件は次のように指定されます。

#requires -Version N[.n]

ここで、N は (必須) メジャー バージョンで、n は (省略可能) マイナー バージョンです。

requires-comment は、任意のスクリプト ファイルに存在できます。ただし、関数またはコマンドレット内に存在することはできません。 ソース行の最初の項目である必要があります。 スクリプトには、複数の "requires コメント" を記述することができます。

文字シーケンスは、そのシーケンスが # または <#で始まる場合にのみ、コメントとして認識されます。 たとえば、hello#there は 1 つのトークンと見なされますが、hello #there はトークン hello の後に 1 行のコメントが続いていると見なされます。 次の空白文字だけでなく、コメント開始シーケンスの前には、式の終了文字またはステートメント終了文字 ()}]'";など) を付けることもできます。

"requires コメント" はスナップイン内には記述できません。

の必須コメントには、他に 4 つの形式があります。

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

2.2.4 空白

構文:

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

説明:

空白 は、1 つ以上の 空白文字 文字の任意のシーケンスで構成されます。

空白がトークンの区切り記号として機能する場合を除き、無視されます。

一部の一般的な言語とは異なり、PowerShell では行ターミネータ文字 (§2.2.2) は空白とは見なされません。 ただし、行終端記号の直前にバッククォート文字 ` (U+0060) を置くことで空白として扱うことができます。 これは、行の内容が構文的に完了しても、次の行に前の行に関連付けられるトークンが含まれている場合に必要です。 例えば

$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

この例では、バッククォートによりソース行が継続することが示されます。 次の式は、$number = 10 + 20 - 50と同じです。

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

2.3 トークン

構文:

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

説明:

トークン は、PowerShell 言語内で最小の字句要素です。

トークンは、改行 、コメント、空白、またはその任意の組み合わせで区切ることができます。

2.3.1 キーワード

構文:

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

説明:

キーワード は、コンテキスト依存の場所で使用する場合に特別な意味を持つ文字のシーケンスです。 ほとんどの場合、これはステートメントの最初のトークンです。ただし、文法で示されているように、他の場所もあります。 (キーワードのように見えるが、キーワード コンテキストでは使用されていないトークンは、コマンド名の または コマンド引数です)。

キーワード classdefinefromusing、および var は、将来使用するために予約されています。

手記

エディターの注意: class キーワードと using キーワードは、PowerShell 5.0 で導入されました。 「about_Classes」と「about_Using」を参照してください。

2.3.2 変数

構文:

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

説明:

変数については、(§5) で詳しく説明します。 変数 $? は、§2.3.2.2で説明されています。 スコープについては、§3.5で説明します。

変数 $$$^ は、この仕様の範囲外である対話型環境で使用するために予約されています。

変数名を書き込むには、2 つの方法があります。かっこで囲まれた変数名は、$で始まり、その後に 1 つ以上のほぼ任意の文字の中かっこで区切られたセットが続きます。通常の変数名。これは $で始まり、その後に、かっこで囲まれた変数名よりも制限の厳しいセットの 1 つ以上の文字のセットが続きます。 すべての通常の変数名は、対応するブレース変数名を使用して表すことができます。

$totalCost
$Maximum_Count_26

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

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

変数名の長さに制限はありません。変数名のすべての文字は有意であり、大文字と小文字は区別 "されません"。

変数には、ユーザー定義 (§2.3.2.1)、automatic (§2.3.2.2)、preference (§2.3.2.3) があります。 これらはすべて同じスコープ (§3.5) で共存できます。

次の関数の定義と呼び出しについて考えてみましょう。

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

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

各引数は、位置または名前で一度に 1 つずつ渡されます。 ただし、一連の引数は、ランタイム環境で処理される個々の引数に拡張されたグループとして渡すことができます。 この自動的な引数の展開は "スプラッティング" と呼ばれます。 例えば

$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

これは、渡される変数の最初の文字として $ の代わりに @ を使用することで実現されます。 この表記は、コマンドの引数でのみ使用できます。

名前は、それぞれ仮想ドライブ (§3.1) に格納されるさまざまな名前空間にパーティション分割されます。 たとえば、変数は Variable:に格納され、環境変数は Env:に格納され、関数は Function:に格納され、エイリアスは Alias:に格納されます。 これらの名前はすべて、"変数スコープ" 内の "変数名前空間" の生成を使用して変数としてアクセスできます。 例えば

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

明示的な Variable: 名前空間で変数名を使用することは、その修飾なしで同じ変数名を使用することと同じです。 たとえば、$v$Variable:v は交換可能です。

変数は、言語で定義するだけでなく、New-Variableコマンドレットで定義することもできます。

2.3.2.1 ユーザー定義変数

文法で許可されているが、自動変数または基本設定変数では使用できない変数名は、ユーザー定義変数で使用できます。

ユーザー定義変数は、ユーザー定義スクリプトによって作成および管理されます。

2.3.2.2 自動変数

自動変数には、PowerShell 環境に関する状態情報が格納されます。 これらの値は、ユーザーが記述したスクリプトで読み取ることができますが、書き込まれません。

手記

このドキュメントで最初に見つかったテーブルは、重複を減らすために削除されました。 自動変数の完全な一覧については、about_Automatic_Variablesを参照してください。

2.3.2.3 基本設定変数

基本設定変数には、セッションのユーザー設定が格納されます。 これらは、PowerShell ランタイム環境によって作成および初期化されます。 値は、ユーザーが記述したスクリプトで読み書きできます。

手記

このドキュメントで最初に見つかったテーブルは、重複を減らすために削除されました。 基本設定変数の完全な一覧については、about_Preference_Variablesを参照してください。

2.3.3 コマンド

構文:

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 パラメーター

構文:

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

説明:

コマンドが呼び出されると、1 つ以上の 引数、対応する一連の パラメーターコマンド内からアクセスされる値を使用して情報を渡すことができます。 パラメーターを引数と照合するプロセスは、パラメーター バインド呼び出されます。

引数には次の 3 種類があります。

  • Switch パラメーター (§8.10.5) -- この形式は コマンド-パラメーター に従い、first-parameter-charparameter-chars を組み合わせてスイッチ名を構成します。このスイッチ名は、呼び出されるコマンド内のパラメーターの名前 (先頭の -を除く) に対応しています。 末尾のコロンを省略した場合、この引数の存在は、対応するパラメーターが $trueに設定されていることを示します。 末尾のコロンが存在する場合、直後の引数はブール型の値を指定する必要があり、対応するパラメーターはその値に設定されます。 たとえば、次の呼び出しは同等です。

    Set-MyProcess -Strict
    Set-MyProcess -Strict: $true
    
  • 引数付きパラメーター (§8.10.2) -- "コマンド-パラメーター" という形式で、"先頭パラメーター文字" と "パラメーター文字列" を合わせてパラメーター名とし、起動されるコマンドのパラメーター名 (先頭の - を除いたもの) に対応します。 末尾にコロンを付けることはできません。 直後の引数は、関連付けられた値を指定します。 たとえば、パラメーター $base$exponentを持つコマンド Get-Powerの場合、次の呼び出しは同等です。

    Get-Power -base 5 -exponent 3
    Get-Power -exponent 3 -base 5
    
  • 位置引数 (§8.10.2) - 引数とそれに対応するコマンド内のパラメーターには、1 番目の位置が 0 の位置があります。 位置 0 の引数は、位置 0 のパラメーターにバインドされます。位置 1 の引数は、位置 1 のパラメーターにバインドされます。などなど。 たとえば、パラメーターが 0 と 1 の位置にそれぞれ $base パラメーターと $exponent を持つコマンド Get-Powerを指定すると、次はそのコマンドを呼び出します。

    Get-Power 5 3
    

特殊パラメーター -- および --%の詳細については、§8.2 を参照してください。

コマンドが呼び出されると、パラメーター名が省略される場合があります。同じコマンドで受け入れられる他のパラメーターの名前に関して明確である場合は、完全名の先頭部分を個別に使用できます。

パラメーター バインドの詳細については、§8.14を参照してください。

2.3.5 リテラル

構文:

literal:
    integer-literal
    real-literal
    string-literal

2.3.5.1 数値リテラル

数値リテラルには、整数 (§2.3.5.1.1) と real (§2.3.5.1.2) の 2 種類があります。 どちらも乗数サフィックス (§2.3.5.1.3) を持つことができます。

2.3.5.1.1 整数リテラル

構文:

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

説明:

整数リテラルの型は、その値、long-type-suffixの有無、および の数値乗数 (§2.3.5.1.3) によって決まります。

"long 型サフィックス" のない整数リテラルの場合

  • その値を int 型 (§4.2.3) で表すことができる場合、その型です。
  • それ以外の場合、値を long (§4.2.3) 型で表すことができる場合は、その型です。
  • それ以外の場合、その値を decimal 型 (§2.3.5.1.2) で表すことができる場合は、その型です。
  • それ以外の場合は、double 型 (§2.3.5.1.2) で表されます。

"long 型サフィックス" のある整数リテラルの場合

  • その値が long 型 (§4.2.3) で表すことができる場合、その型。
  • それ以外の場合は、そのリテラルの形式が正しくありません。

整数値の 2 補数表現では、正の値よりも 1 つ多くの負の値があります。 int 型の場合、その追加値は -2147483648 です。 long 型の場合、その余分な値は -9223372036854775808 です。 通常、トークン2147483648は long 型のリテラルとして扱われますが、単項演算子の直前にある場合、その演算子とリテラルは、最も小さい値を持つ int 型のリテラルとして扱われます。 同様に、トークン9223372036854775808は通常、decimal 型の実リテラルとして扱われますが、単項演算子の直前にある場合、その演算子とリテラルは、最も小さい値を持つ long 型のリテラルとして扱われます。

整数リテラルの例としては、123 (int)、123L (long)、200000000000 (long) などがあります。

byte 型の整数リテラルなどはありません。

2.3.5.1.2 実数リテラル

構文:

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)

説明:

実際のリテラルには、数値乗数 (§2.3.5.1.3) が含まれている場合があります。

実数リテラルには、doubledecimal の 2 種類があります。 これらは、の存在がないこと、またはの10進型サフィックスの存在によって示されます。 ("float 実数リテラル" のようなものはありません。)

double 実数リテラルは double 型 (§4.2.4.1) です。 decimal 実数リテラルは decimal 型 (§4.2.4.2) です。 10進数リテラルの分数部分における末尾のゼロは重要です。

指数部の倍精度浮動小数点リテラル内の 10進数字 の値が、サポートされている最小値より小さい場合、その倍精度浮動小数点リテラルの値は 0 になります。 10進数の実数リテラルの指数部におけるの値がサポートされている最小値より小さい場合、そのリテラルの形式は不正です。 decimal 実数リテラルの "指数部" の "10 進数" の値が、サポートされる最大値よりも大きい場合、そのリテラルの形式は正しくありません。

二重実数リテラルの例としては、1.、1.23、.45e35、32.e+12、123.456E-231 があります。

10 進実リテラルの例としては、1d (小数点以下桁数 0)、1.20d (スケール 2)、1.23450e1d (スケール 4 を持つ 12.3450)、1.2345e3d (つまり、 スケール 1 の 1234.5、1.2345e-1d (スケール 5 を持つ 0.12345)、1.2345e-3d (スケール 7 を持つ 0.0012345 など)。

手記

倍精度実数リテラルには分数部や指数部が必要ないため、(123).M のように括弧を使うことによって、値が123の整数オブジェクトに対してプロパティやメソッドMが正しく選択されていることを確認できます。 このかっこが使用されないと、実数リテラルの形式が不正となります。

手記

PowerShell では無限大および NAN のリテラルは用意されていませんが、double 実数リテラルに相当するものは、float 型と double 型の PositiveInfinity、NegativeInfinity、NAN 静的読み取り専用プロパティから取得できます (§4.2.4.1)。

文法では、ダブルリアルリテラルとして始まるものに、lL のタイプサフィックスを付けることができます。 このようなトークンは、実際には long 型で表される値を持つ整数リテラルです。

手記

この機能は、以前のバージョンの PowerShell との下位互換性のために保持されています。 ただし、プログラマはリテラルの実際の値を簡単に隠すことができるため、この形式の整数リテラルを使用しないことをお勧めします。 たとえば、1.2L の値は 1、1.2345e1L は値 12、1.2345e-5L は値 0 であり、いずれもすぐには明らかではありません。

2.3.5.1.3 乗数サフィックス

構文:

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

説明:

便宜上、整数リテラルと実数リテラルには、一般的に使用される、一連の 10 の累乗の 1 つを示す "数値乗数" を含めることができます。 数値乗数 は、大文字と小文字の任意の組み合わせで記述できます。

乗数 意味
kb キロバイト (1024) 1 kb ≡ 1024
メガバイト メガバイト (1024 x 1024) 1.30Dmb ≡ 1363148.80
gb ギガバイト (1024 x 1024 x 1024) 0x10 Gb ≡ 17179869184
tb テラバイト (1024 x 1024 x 1024 x 1024) 1.4e23tb ≡ 1.5393162788864E+35
pb ペタバイト (1024 x 1024 x 1024 x 1024 x 1024) 0x12Lpb ≡ 20266198323167232

2.3.5.2 文字列リテラル

構文:

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 @

説明:

文字列リテラルには、次の 4 種類があります。

  • 逐語的文字列リテラル (単一行の一重引用符)。これは、一重引用符文字のペアで区切られた 0 個以上の文字シーケンスです。 例として、'' と 'red' があります。

  • 展開可能な文字列リテラル (単一行の二重引用符)。これは、二重引用符文字のペアで区切られた 0 個以上の文字シーケンスです。 例として、"" と "red" があります。

  • 逐語的ヒア文字列リテラル (複数行の一重引用符)。これは、それぞれ 2 行以上にまたがるソース行に含まれる、@一重引用符文字一重引用符文字@ の文字ペアで区切られた 0 個以上の文字シーケンスです。 例を次に示します。

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • 展開可能なヒア文字列リテラル (複数行の二重引用符)。これは、それぞれ 2 行以上にまたがるソース行に含まれる、@二重引用符文字二重引用符文字@ の文字ペアで区切られた 0 個以上の文字シーケンスです。 例を次に示します。

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

"逐語的ヒア文字列リテラル" と "展開可能なヒア文字列リテラル" の場合は、空白 (無視されます) を除き、開始区切り記号文字ペアと同じソース行に文字を続けることはできません。また、終了区切り記号文字ペアと同じソース行の前に文字を先行させることはできません。

"逐語的ヒア文字列リテラル" または "展開可能なヒア文字列リテラル" の "本体" は、開始区切り記号の後の最初のソース行の先頭から始まり、終了区切り記号の前の最後のソース行の末尾で終わります。 本体は空の場合があります。 終了区切り記号の前の最後のソース行の行ターミネータは、そのリテラルの本体の一部ではありません。

これらの種類のリテラルは、文字列型 (4.3.1) です。

逐語的文字列リテラル または 展開可能文字列リテラル を区切るために使用される文字は、その文字を2回続けて書くことで、その文字列リテラルに含めることができます。 たとえば、'What''s the time?'"I said, ""Hello""."などです。 ただし、の一重引用符文字 は、展開可能な文字列リテラル内では特別な意味を持たないし、二重引用符文字 は、逐語的文字列リテラル内で特別な意味を持たない。

"展開可能な文字列リテラル" と "展開可能なヒア文字列リテラル" には、"エスケープ文字" (§2.3.7) が含まれる場合があります。 たとえば、次の文字列リテラルがパイプラインに書き込まれる場合、結果は次のようになります。

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

"展開可能な文字列リテラル" と "展開可能なヒア文字列リテラル" に変数名が含まれている場合、その名前の直前にエスケープ文字が前置されていない限り、その変数の値の文字列表現に置き換えられます (§6.7)。 これは変数置換と呼ばれます。

手記

変数名が大きな式の一部である場合、変数名のみが置き換えられます。 たとえば、$a が要素 100 と 200 を含む配列である場合、">$a.Length<">100 200.Length< になり、">$($a.Length)<" 結果は >2<になります。 以下の部分式の展開を参照してください。

たとえば、ソース コード

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

結果は "展開可能な文字列リテラル" になります

The value of $count is 10.

次の点を考慮してください。

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

結果は次のようになります。

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

拡張可能なストリングリテラル拡張可能なヒアストリングリテラルでは、$( ... ) の形式のテキストを サブ式 として扱うことで、サブ式拡張と呼ばれる一種の置換もサポートされています(§7.1.6)。 このようなテキストは、その式の値の文字列表現 (§6.8) に置き換えられます。 結果文字列の構築に関しては、サブ式内の'' ステートメントリスト でトークンを分離するために使用される空白は無視されます。

次の例の場合、

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

結果は、次の "展開可能な文字列リテラル" になります。

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

次のソースの場合、

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

結果は、次の "展開可能な文字列リテラル" になります。

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

これらの 4 行は、次のようにより簡潔に記述されている可能性があります。

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

次の例では、

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

結果として得られる展開可能な文字列リテラル は次のとおりです。

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

次に示すように、のサブ式 には、変数置換とサブ式拡張の両方を持つ文字列リテラルを含めることができます。 内部の 装飾可能文字列リテラルの区切り文字をエスケープする必要はありません。これは、それらが サブ式 内にあるため、外側の 装飾可能文字列リテラルの終端文字になり得ないことを意味します。

拡張可能文字列リテラル または 拡張可能ヒア文字列リテラル を含む変数置換やサブ式拡張は、そのリテラルが使われるたびに評価されます。例えば、

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

における結果は、次の "展開可能な文字列リテラル" になります。

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

"逐語的ヒア文字列リテラル" の内容は、本体内の先頭または末尾の空白を含め、逐語的に取得されます。 そのため、埋め込み 単一引用符文字を 2 倍にする必要はありません。また、置換や拡張は必要ありません。 例えば

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

この結果は、リテラルになります

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

"展開可能なヒア文字列リテラル" の内容は置換と展開の対象ですが、本体内の先頭または末尾の空白が、"部分式" の外側にある場合は逐語的に取得され、埋め込まれた "二重引用符文字" は二重にする必要はありません。 例えば

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

における結果は、展開すると、次のリテラルになります。

That's it!
2 * 3 = 6

"逐語的ヒア文字列リテラル" と "展開可能なヒア文字列リテラル" の両方に関して、本体内のそれぞれの行終端記号は、実装で定義された方法で結果のリテラルに表されます。 たとえば、次のようになります。

$lit = @"
abc
xyz
"@

本体の 2 行目には先頭にスペースが 2 つあり、本体の 1 行目と 2 行目には行終端記号があります。ただし、本体の 2 行目の終端記号は、その本体の一部では "ありません"。 結果のリテラルは、"abc<implementation-defined character sequence>xyz"と同じです。

手記

ソースの読みやすさを高めるために、長い文字列リテラルは、行終端記号を挿入せずに複数のソース行で分割できます。 これを行うには、各部分を個別のリテラルとして書き込み、その部分を + 演算子 (§7.7.2) と連結します。 この演算子には、オペランドに 4 種類の文字列リテラルのいずれかを指定できます。

手記

文字リテラル自体のようなものはありませんが、次のように、1 文字の文字列の最初の文字にアクセスすることで同じ効果を得ることができます: [char]"A" または "A"[0]

"逐語的ヒア文字列リテラル" と "展開可能なヒア文字列リテラル" の両方について、本文内のそれぞれの行終端記号は、指定されたとおりに表されます。

2.3.5.3 null リテラル

自動変数 $null (§2.3.2.2) を参照してください。

2.3.5.4 ブールリテラル

自動変数の $false$true (§2.3.2.2) を参照してください。

2.3.5.5 配列リテラル

PowerShell では、単項コンマ演算子 (§7.2.1)、配列式 (§7.1.7)、バイナリ コンマ演算子 (§7.3)、範囲演算子 (§7.4) を使用して、配列型 (§9) の式を記述できます。

2.3.5.6 ハッシュ リテラル

PowerShell では、hashtable 型 (§10) の式を、hash-literal-expression (§7.1.9) を使用して記述できます。

2.3.5.7 型名

構文:

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 演算子と区切り記号

構文:

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

説明:

&&|| は、将来使用するために予約されています。

手記

エディターの注: パイプライン チェーン演算子の &&|| は、PowerShell 7 で導入されました。 「about_Pipeline_Chain_Operators」を参照してください。

演算子 ダッシュ に続く名前は、その目的のために演算子コンテキストでのみ予約されています。

ダッシュ で始まる演算子は、その ダッシュ とその後のトークンの間に空白を含めてはなりません。

2.3.7 エスケープ文字

構文:

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

説明:

エスケープ文字 は、Backtick 文字 (U+0060) をプレフィックスとして付けることで、文字に特別な解釈を割り当てる方法です。 次の表は、各 エスケープ文字の意味を示しています。

エスケープ文字 意味
`a アラート (U+0007)
`b バックスペース (U+0008)
`f フォームフィード (U+000C)
`n 改行 (U+000A)
`r キャリッジ リターン (U+000D)
`t 水平タブ (U+0009)
`v 垂直タブ (U+0009)
`' 一重引用符 (U+0027)
`" 二重引用符 (U+0022)
`` バッククォート (U+0060)
`0 NUL (U+0000)
`x x が上記の文字以外の文字である場合、バックティック文字は無視され、x は文字どおり取得されます。

上記の表の最後のエントリの意味は、それ以外の場合はトークンを分離するスペースをトークンの一部にすることができるということです。 たとえば、スペースを含むファイル名は、Test` Data.txt (および 'Test Data.txt' または "Test Data.txt") として書き込むことができます。