2. 字句構造

2.1 文法

この仕様には、PowerShell 言語の構文が 2 つの文法を用いて示されています。 "字句文法" (§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

説明:

入力ソース ストリーム内に "改行文字" が存在すると、エラー報告、単一行コメントの終端の検出などに使用できるように、行に分割されます。

行終端記号は、空白として扱うことができます (§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 コメント" には、それを含むスクリプトを実行するために満たさなければならない条件を指定します。 最上位の条件は、スクリプトの実行に使用される PowerShell のバージョンです。 最小バージョンの要件は、次のように指定されます。

#requires -Version N[.n]

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

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

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

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

"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

説明:

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

キーワード classdefinefromusingvar は将来の使用のために予約されています。

注意

エディターの注: classusing キーワードは、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 つ以上のほぼ任意の文字セットが続く "かっこ付き変数名"。もう 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)、自動変数 (§2.3.2.2)、ユーザー設定変数 (§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 種類の引数があります。

  • スイッチ パラメーター (§8.10.5) -- "コマンド-パラメーター" という形式で、"先頭パラメーター文字" と "パラメーター文字列" を合わせてスイッチ名とし、起動されるコマンドのパラメーター名 (先頭の - を除いたもの) に対応します。 末尾のコロンを省略した場合、この引数の指定により、対応するパラメーターが $true に設定されます。 末尾のコロンが存在する場合、直後の引数は bool 型の値を指定する必要があり、対応するパラメーターはその値に設定されます。 たとえば、次の式は同等です。

    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) - 引数とそれに対応するコマンド内のパラメーターは位置を持っており、最初の位置は 0 となります。 0 の位置にある引数は 0 の位置にあるパラメーターに、1 の位置にある引数は 1 の位置にあるパラメーターに、というようにバインドされます。 たとえば、パラメーター $base$exponent がそれぞれ 0 と 1 の位置にある 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) と実数 (§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 型サフィックス" があるかどうか、"数値乗数" (§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 種類があります。 これらは、それぞれ、"decimal 型サフィックス" があるかどうかによって示されます。 ("float 実数リテラル" のようなものはありません。)

double 実数リテラルは double 型 (§4.2.4.1) です。 decimal 実数リテラルは decimal 型 (§4.2.4.2) です。 decimal 実数リテラルの小数部の末尾の 0 は有意です。

double 実数リテラルの "指数部" の "10 進数" の値が、サポートされる最小値よりも小さい場合、その double 実数リテラルの値は 0 になります。 decimal 実数リテラルの "指数部" の "10 進数" の値が、サポートされる最小値よりも小さい場合、そのリテラルの形式は正しくありません。 decimal 実数リテラルの "指数部" の "10 進数" の値が、サポートされる最大値よりも大きい場合、そのリテラルの形式は正しくありません。

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

decimal 実数リテラルの例としては、1d (小数点以下桁数は 0)、1.20d (小数点以下桁数は 2)、1.23450e1d (すなわち 12.3450、小数点以下桁数は 4)、1.2345e3d (すなわち 1234.5、小数点以下桁数は 1)、1.2345e-1d (すなわち 0.12345、小数点以下桁数は 5)、1.2345e-3d (すなわち 0.0012345、小数点以下桁数は 7) などがあります。

注意

double 実数リテラルには、分数または指数部を含める必要がないため、値が 123 である整数オブジェクトに対して、プロパティまたはメソッド M が選択されていることを表現する場合は、(123).M におけるグループ化のかっこが必要です。 このかっこが使用されないと、実数リテラルの形式が不正となります。

注意

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

文法上、もともと double 実数リテラルであるものでも、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) 1kb ≡ 1024
mb メガバイト (1024 x 1024) 1.30Dmb ≡ 1363148.80
gb ギガバイト (1024 x 1024 x 1024) 0x10Gb ≡ 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<

"逐語的ヒア文字列リテラル" の内容は、本体内の先頭または末尾の空白を含め、逐語的に取得されます。 そのため、埋め込まれた "一重引用符文字" は二重にする必要はありません。また、置換も展開も行う必要はありません。 たとえば、次のように入力します。

$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 種類の文字列リテラルのいずれかを指定できます。

注意

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

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

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 では、配列型 (9) の式を、単項コンマ演算子 (§7.2.1)、"配列式" (§7.1.7)、二項コンマ演算子 (§7.3)、range 演算子 (§7.4) を使用して記述できます。

2.3.5.6 ハッシュ リテラル

PowerShell では、Hashtable 型 (§10) の式を "ハッシュ リテラル式" (§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

説明:

"エスケープ文字" とは、バッククォート文字 (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") のように記述できます。