次の方法で共有


7. 式

編集メモ

重要

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 プラットフォームの書式設定に対応するために、いくつかの編集の変更が行われました。 一部の入力ミスと軽微なエラーが修正されました。

構文:

expression:
    primary-expression
    bitwise-expression
    logical-expression
    comparison-expression
    additive-expression
    multiplicative-expression

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

dashdash:
    dash dash

説明:

は、メソッド、関数、書き込み可能な場所、または値を指定する演算子とオペランドのシーケンスです。は値の計算を指定します。1つ以上の副作用を生み出す。又はその何らかの組み合わせを行う。 例えば

  • リテラル 123 は、int 値 123 を指定する式です。
  • 1,2,3,4 は、表示された値を持つ 4 要素配列オブジェクトを指定します。
  • 10.4 * $a は計算を指定します。
  • $a++ は副作用を生成します。
  • $a[$i--] = $b[++$j] は、これらの組み合わせを実行します。

一部の演算子に指定されている場合を除き、式内の用語の評価順序と副作用が発生する順序はどちらも指定されていません。 指定されていない動作の例としては、$i++ + $i$i + --$i$w[$j++] = $v[$j]があります。

PowerShell の実装では、ユーザー定義型のサポートが提供される場合があり、それらの型に対して操作が定義されている場合があります。 このような型と操作のすべての詳細は、実装で定義されています。

最上位レベルの式 は、より大きな式の一部ではありません。 最上位の式に副作用演算子が含まれている場合、その式の値はパイプラインに書き込まれません。それ以外の場合は書き込まれます。 詳細については、§7.1.1 を参照してください。

通常、コレクション ([§4§4]) を指定する式は、その式の値が使用されるときに、その構成要素に列挙されます。 ただし、式がコマンドレットの呼び出しである場合は、この操作は行われません。 例えば

$x = 10,20,30
$a = $($x; 99)                     # $a.Length is 4

$x = New-Object 'int[]' 3
$a = $($x; 99)                     # equivalent, $a.Length is 4

$a = $(New-Object 'int[]' 3; 99)   # $a.Length is 2

$(...) 演算子の最初の 2 つの使用では、コレクションを指定する式は変数 $xであり、3 つの int 値と int 99 が列挙されます。 ただし、3 番目のケースでは、式はコマンドレットへの直接呼び出しであるため、結果は列挙されず、$aint[3]intの 2 つの要素の配列です。

PowerShell で演算が定義されていない場合は、左側のオペランドによって指定された値の型が検査され、対応する op_<operation> メソッドがあるかどうかを確認します。

7.1 基本的な式

構文:

primary-expression:
    value
    member-access
    element-access
    invocation-expression
    post-increment-expression
    post-decrement-expression

value:
    parenthesized-expression
    sub-expression
    array-expression
    script-block-expression
    hash-literal-expression
    literal
    type-literal
    variable

7.1.1 括弧のグループ化

構文:

ヒント

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

parenthesized-expression:
    ( new-lines~opt~ pipeline new-lines~opt~ )

説明:

かっこで囲まれた式は、かっこのない式と同じ型と値を持つ のプライマリ式 です。 式が変数を指定する場合、かっこでつながれた式はその同じ変数を指定します。 たとえば、$x.m($x).m は同等です。

グループ化かっこは、式内の既定の優先順位と結合性を文書化するために式で使用できます。 また、既定の優先順位と結合規則をオーバーライドするためにも使用できます。 例えば

4 + 6 * 2    # 16
4 + (6 * 2)  # 16 document default precedence
(4 + 6) * 2  # 20 override default precedence

通常、最上位レベルのグループ化かっこは冗長です。 ただし、必ずしもそうであるとは限りません。 次の例を考えてみましょう。

2,4,6       # Length 3; values 2,4,6
(2,4),6     # Length 2; values [object[]],int

2 番目のケースでは、かっこによってセマンティクスが変更され、2 つの要素が 2 つの整数の配列であり、スカラー整数 6 である配列になります。

別の例外を次に示します。

23.5/2.4          # pipeline gets 9.79166666666667
$a = 1234 * 3.5   # value not written to pipeline
$a                # pipeline gets 4319

最初と 3 番目のケースでは、結果の値がパイプラインに書き込まれます。 ただし、2 番目のケースの式は評価されますが、最上位に副作用演算子 = があるため、結果はパイプラインに書き込まれません。 ($a = 部分を削除すると、* は副作用演算子ではないため、値を書き込むことが可能になります)。

最上位の副作用を含まない式の値がパイプラインに書き込まれないようにするには、次のように明示的に破棄します。

# None of these value are written to pipeline
[void](23.5/2.4)
[void]$a
$null = $a
$a > $null

最上位の副作用を含む式の値をパイプラインに書き込むには、次のようにその式をかっこで囲みます。

($a = 1234 * 3.5) # pipeline gets 4319

したがって、このケースのグループ化かっこは冗長ではありません。

次の例では、文字列リテラルで変数置換 (§2.3.5.2) が行われます。

">$($a = -23)<"    # value not written to pipeline, get ><
">$(($a = -23))<"  # pipeline gets >-23<

最初のケースでは、かっこは サブ式の区切り記号 であって、グループ化のかっこ ではありません。そして、最上位の式には副作用演算子が含まれているため、その式の値はパイプラインに書き込まれません。 もちろん、> 文字と < 文字は引き続き記述されます)。 第2のケースに示すように、グループ化の括弧を追加すると、書き込みが有効になります。

次の例には、それぞれ最上位の副作用演算子が含まれています。

$a = $b = 0      # value not written to pipeline
$a = ($b = 0)    # value not written to pipeline
($a = ($b = 0))  # pipeline gets 0

++$a             # value not written to pipeline
(++$b)           # pipeline gets 1

$a--             # value not written to pipeline
($b--)           # pipeline gets 1

最上位レベルの副作用演算子が含まれていない式をグループ化かっこで囲むと、それらのかっこは冗長になります。 例えば;

$a      # pipeline gets 0
($a)    # no side effect, so () redundant

2 つの副作用を持つ次の例を考えてみましょう。どちらも最上位レベルに存在しません。

12.6 + ($a = 10 - ++$b) # pipeline gets 21.6.

最上位の式には副作用がないため、結果はパイプラインに書き込まれます。

7.1.2 メンバー アクセス

構文:

member-access:
    primary-expression . new-line~opt~ member-name
    primary-expression :: new-line~opt~ member-name

primary-expression の後に空白を使用することはできません。

説明:

演算子 . は、オブジェクトからインスタンス メンバーを選択したり、Hashtableからキーを選択したりするために使用されます。 左オペランドはオブジェクトを指定する必要があり、右側のオペランドはアクセス可能なインスタンス メンバーを指定する必要があります。

右オペランドは、左オペランドによって指定されたオブジェクトの型内でアクセス可能なインスタンス メンバーを指定するか、左オペランドが配列を指定する場合、右側のオペランドは配列の各要素内のアクセス可能なインスタンス メンバーを指定します。

. 演算子の前に空白を使用することはできません。

この演算子は連想的なままです。

演算子 :: は、特定の型から静的メンバーを選択するために使用されます。 左側のオペランドは型を指定する必要があり、右側のオペランドはその型内でアクセス可能な静的メンバーを指定する必要があります。

:: 演算子の前に空白を使用することはできません。

この演算子は連想的なままです。

右側のオペランドが左オペランドによって指定されたオブジェクトの型内の書き込み可能な場所を指定する場合、式全体が書き込み可能な場所を指定します。

例:

$a = 10, 20, 30
$a.Length                    # get instance property

(10, 20, 30).Length

$property = "Length"
$a.$property                 # property name is a variable

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123
}
$h1.FirstName                # designates the key FirstName
$h1.Keys                     # gets the collection of keys

[int]::MinValue              # get static property
[double]::PositiveInfinity   # get static property
$property = "MinValue"
[long]::$property            # property name is a variable

foreach ($t in [byte], [int], [long]) {
    $t::MaxValue             # get static property
}

$a = @{ID = 1 }, @{ID = 2 }, @{ID = 3 }
$a.ID                        # get ID from each element in the array

7.1.3 呼び出し式

構文:

invocation-expression:
    primary-expression . new-line~opt~ member-name argument-list
    primary-expression :: new-line~opt~ member-name argument-list

argument-list:
    ( argument-expression-list~opt~ new-lines~opt~ )

プライマリ式の後に空白は使えません。

説明:

呼び出し式 は、primary-expression.member-name または primary-expression::member-nameによって指定されたメソッドを呼び出します。 引数リスト の中のかっこには、式をコンマで区切った、場合によっては空のリストが含まれます。これは、値をメソッドに渡す 引数 を指定します。 メソッドが呼び出される前に、必要に応じて、引数が評価され、§6の規則に従って変換され、メソッドで予期される型に一致します。 primary-expression.member-nameprimary-expression::member-name、および引数の評価順序は指定されていません。

この演算子は連想的なままです。

呼び出し式 の結果の型は、メソッド指定子 です (§4.5.24)。

例:

[math]::Sqrt(2.0)            # call method with argument 2.0
[char]::IsUpper("a")         # call method
$b = "abc#$%XYZabc"
$b.ToUpper()                 # call instance method

[math]::Sqrt(2)              # convert 2 to 2.0 and call method
[math]::Sqrt(2D)             # convert 2D to 2.0 and call method
[math]::Sqrt($true)          # convert $true to 1.0 and call method
[math]::Sqrt("20")           # convert "20" to 20 and call method

$a = [math]::Sqrt            # get method descriptor for Sqrt
$a.Invoke(2.0)               # call Sqrt via the descriptor
$a = [math]::("Sq"+"rt")     # get method descriptor for Sqrt
$a.Invoke(2.0)               # call Sqrt via the descriptor
$a = [char]::ToLower         # get method descriptor for ToLower
$a.Invoke("X")               # call ToLower via the descriptor

7.1.4 要素アクセス

構文:

element-access:
    primary-expression [ new-lines~opt~ expression new-lines~opt~ ]

説明:

プライマリ式 と左角かっこ ([) の間に空白があってはなりません。

7.1.4.1 配列の添字

説明:

配列については、§9 で詳しく説明します。 が 1 次元配列の場合は、§7.1.4.5参照してください。

1次元配列 A が指定する場合、演算子 は、式 の値が に変換された後に、 にある要素 を返します。 結果の型は、添字を付けられた配列の要素型になります。 式 が負の値の場合、A[expression]A[A.Length + expression]にある要素を指定します。

1 次式 B2 次元配列を指定すると、演算子 は、 の値と、 (コンマ区切りリストとして指定される) 列 コンポーネントの値が に変換された後に、 位置にある要素を返します。 結果の型は、添字を付けられた配列の要素型になります。 1 次元配列とは異なり、負の位置には特別な意味はありません。

1 次式 3 次元以上の配列を指定する場合、2 次元配列の規則が適用され、次元位置は値のコンマ区切りのリストとして指定されます。

既存でない要素に対する読み取りアクセスが試行された場合、結果は $null。 存在しない要素に書き込むのはエラーです。

多次元配列の添字式の場合、ディメンション位置式の評価順序は指定されていません。 たとえば、3 次元配列 $aを指定すると、$a[$i++,$i,++$i] の動作は指定されていません。

が配列の場合は、§7.1.4.5参照してください。

この演算子は連想的なままです。

例:

$a = [int[]](10,20,30) # [int[]], Length 3
$a[1] # returns int 20
$a[20] # no such position, returns $null
$a[-1] # returns int 30, i.e., $a[$a.Length-1]
$a[2] = 5 # changes int 30 to int 5
$a[20] = 5 # implementation-defined behavior

$a = New-Object 'double[,]' 3,2
$a[0,0] = 10.5 # changes 0.0 to 10.5
$a[0,0]++ # changes 10.5 to 10.6

$list = ("red",$true,10),20,(1.2, "yes")
$list[2][1] # returns string "yes"

$a = @{ A = 10 },@{ B = $true },@{ C = 123.45 }
$a[1]["B"] # $a[1] is a Hashtable, where B is a key

$a = "red","green"
$a[1][4] # returns string "n" from string in $a[1]

既存以外の要素への書き込みアクセスが試行されると、IndexOutOfRange 例外が発生します。

7.1.4.2 文字列の添字

説明:

プライマリ式 が S文字列を指定すると、演算子 は、式で示される 0 から始まる位置にある文字 char として返します。 がその文字列の長さ以上の場合、結果は $nullとなります。 式 が負の値の場合、S[expression]S[S.Length + expression]にある要素を指定します。

例:

$s = "Hello"   # string, Length 5, positions 0-4
$c = $s[1]     # returns "e" as a string
$c = $s[20]    # no such position, returns $null
$c = $s[-1]    # returns "o", i.e., $s[$s.Length-1]

7.1.4.3 ハッシュテーブルへの添字

説明:

プライマリ式 ハッシュテーブルを指定すると、演算子 は、式によって指定されたキーに関連付けられた値 返します。 の型は制限されません。

が 1 つのキー名である場合、結果は関連付けられた値であり、そのようなキーが存在しない限り、その型を持ち、その場合、結果は $null$null がキーとして使用される場合、動作は実装定義です。 がキー名の配列である場合は、§7.1.4.5参照してください。

が配列の場合は、§7.1.4.5参照してください。

例:

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1['FirstName']     # the value associated with key FirstName
$h1['BirthDate']     # no such key, returns $null

$h1 = @{ 10 = "James"; 20.5 = "Anderson"; $true = 123 }
$h1[10]              # returns value "James" using key 10
$h1[20.5]            # returns value "Anderson" using key 20.5
$h1[$true]           # returns value 123 using key $true

が単一のキー名の場合に、Hashtable の添字として $null を唯一の値として利用した場合、NullArrayIndex 例外が発生します。

7.1.4.4 XML ドキュメントの添字

説明:

プライマリ式 が xml 型のオブジェクトを指定すると、 は必要に応じて文字列に変換され、演算子 は式で指定された名前を持つ最初の子要素 返します。 式の 型は文字列である必要があります。 結果の型は実装定義です。 結果に添字を付けて、最初の子要素を返すことができます。 式で指定された名前の子要素 存在しない場合、結果は 。 結果では、書き込み可能な場所は指定されません。

例:

$x = [xml]@"
<Name>
<FirstName>Mary</FirstName>
<LastName>King</LastName>
</Name>
"@

$x['Name']                # refers to the element Name
$x['Name']['FirstName']   # refers to the element FirstName within Name
$x['FirstName']           # No such child element at the top level, result is $null

結果の型は、System.Xml.XmlElement または System.Stringです。

7.1.4.5 配列スライスの生成

プライマリ式 が列挙可能な型 (§4) または Hashtable のオブジェクトを指定し、 が 1 次元配列である場合、結果は、の要素によって指定 プライマリ式 の要素を含む配列スライス (§9.9) になります。

Hashtable の場合、配列スライスには、提供されたキーに関連付けられた値が含まれます。そのようなキーが存在しない限り、対応する要素は $null$null が任意のキー名として使用される場合、動作は実装で定義されます。

例:

$a = [int[]](30,40,50,60,70,80,90)
$a[1,3,5]                 # slice has Length 3, value 40,60,80
$a[,5]                    # slice with Length 1
$a[@()]                   # slice with Length 0
$a[-1..-3]                # slice with Length 3, value 90,80,70
$a = New-Object 'int[,]' 3,2
$a[0,0] = 10; $a[0,1] = 20; $a[1,0] = 30
$a[1,1] = 40; $a[2,0] = 50; $a[2,1] = 60
$a[(0,1),(1,0)]           # slice with Length 2, value 20,30, parens needed
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1['FirstName']          # the value associated with key FirstName
$h1['BirthDate']          # no such key, returns $null
$h1['FirstName','IDNum']  # returns [object[]], Length 2 (James/123)
$h1['FirstName','xxx']    # returns [object[]], Length 2 (James/$null)
$h1[$null,'IDNum']        # returns [object[]], Length 2 ($null/123)

Windows PowerShell: が 2 つ以上のキー名のコレクションである場合、$null がキー名として使用されている場合、そのキーは無視され、結果の配列に対応する要素がありません。

7.1.5 後置インクリメント演算子とデクリメント演算子

構文:

post-increment-expression:
    primary-expression ++

post-decrement-expression:
    primary-expression dashdash

説明:

プライマリ式 は、数値データ型 (§4) の値または $nullの値を持つ、書き込み可能な場所を指定する必要があります。 オペランドによって指定された値が $null場合、その値は、演算子が評価される前に int 型と値 0 型に変換されます。 primary-expression によって指定された値の型は、結果の格納時に変更される可能性があります。 割り当てによる型の変更については、§7.11 を参照してください。

後置 ++ 演算子によって生成される結果は、オペランドによって指定された値です。 その結果が得られた後、オペランドによって指定された値は、適切な型の 1 ずつインクリメントされます。 式 E++ の結果の型は、式 E + 1 (§7.7) の結果と同じです。

後置 -- 演算子によって生成される結果は、オペランドによって指定された値です。 その結果が取得された後、オペランドで指定された値は、適切な型になり、1 ずつ減分されます。 式 E-- の結果の型は、式 E - 1 (§7.7) の結果と同じです。

これらの演算子は連想的なままです。

例:

$i = 0                # $i = 0
$i++                  # $i is incremented by 1
$j = $i--             # $j takes on the value of $i before the decrement

$a = 1,2,3
$b = 9,8,7
$i = 0
$j = 1
$b[$j--] = $a[$i++]   # $b[1] takes on the value of $a[0], then $j is
                      # decremented, $i incremented

$i = 2147483647       # $i holds a value of type int
$i++                  # $i now holds a value of type double because
                      # 2147483648 is too big to fit in type int

[int]$k = 0           # $k is constrained to int
$k = [int]::MaxValue  # $k is set to 2147483647
$k++                  # 2147483648 is too big to fit, imp-def behavior

$x = $null            # target is unconstrained, $null goes to [int]0
$x++                  # value treated as int, 0->1

7.1.6 $(...) 演算子

構文:

sub-expression:
    $( new-lines~opt~ statement-list~opt~ new-lines~opt~ )

説明:

ステートメントリスト を省略すると、結果は $null。 それ以外の場合、ステートメントリスト が評価されます。 評価の一環としてパイプラインに書き込まれたオブジェクトは、制約のない 1 次元配列に順番に収集されます。 収集されたオブジェクトの配列が空の場合、結果は $null。 収集されたオブジェクトの配列に 1 つの要素が含まれている場合、結果はその要素になります。それ以外の場合、結果は収集された結果の制約のない 1 次元配列になります。

例:

$j = 20
$($i = 10) # pipeline gets nothing
$(($i = 10)) # pipeline gets int 10
$($i = 10; $j) # pipeline gets int 20
$(($i = 10); $j) # pipeline gets [object[]](10,20)
$(($i = 10); ++$j) # pipeline gets int 10
$(($i = 10); (++$j)) # pipeline gets [object[]](10,22)
$($i = 10; ++$j) # pipeline gets nothing
$(2,4,6) # pipeline gets [object[]](2,4,6)

7.1.7 @(...) 演算子

構文:

array-expression:
    @( new-lines~opt~ statement-list~opt~ new-lines~opt~ )

説明:

ステートメント リスト 省略すると、結果は長さ 0 の制約のない 1 次元配列になります。 それ以外 ステートメント リスト が評価され、評価の一部としてパイプラインに書き込まれたオブジェクトは、制約のない 1 次元配列に順番に収集されます。 結果は、制約されていない (空の可能性がある) 1 次元配列です。

例:

$j = 20
@($i = 10)             # 10 not written to pipeline, result is array of 0
@(($i = 10))           # pipeline gets 10, result is array of 1
@($i = 10; $j)         # 10 not written to pipeline, result is array of 1
@(($i = 10); $j)       # pipeline gets 10, result is array of 2
@(($i = 10); ++$j)     # pipeline gets 10, result is array of 1
@(($i = 10); (++$j))   # pipeline gets both values, result is array of 2
@($i = 10; ++$j)       # pipeline gets nothing, result is array of 0

$a = @(2,4,6)          # result is array of 3
@($a)                  # result is the same array of 3
@(@($a))               # result is the same array of 3

7.1.8 スクリプト・ブロック表現

構文:

script-block-expression:
    { new-lines~opt~ script-block new-lines~opt~ }

script-block:
    param-block~opt~ statement-terminators~opt~ script-block-body~opt~

script-block-body:
    named-block-list
    statement-list

説明:

パラメーター ブロック は、§8.10.9で説明されています。 名前付きブロック リスト は、§8.10.7で説明されています。

スクリプト ブロックは、1 つのユニットとして使用できるステートメントの名前のないブロックです。 スクリプト ブロックを使用して、単一のコマンドであるかのようにコード ブロックを呼び出すか、実行できる変数に割り当てることができます。

名前付きブロック リスト または ステートメント リスト が実行され、結果の型と値は、これらのステートメント セットの結果の型と値になります。

スクリプト ブロック式 の型は、scriptblock (§4.3.7) です。

param-block 省略すると、スクリプト ブロックに渡されるすべての引数は、 (§8.10.1) を介して使用できます。

パラメーター バインド中に、スクリプト ブロックをスクリプト ブロック オブジェクトとして、またはスクリプト ブロックが評価された後の結果として渡すことができます。 詳細については、§6.17 を参照してください。

7.1.9 ハッシュ リテラル式

構文:

hash-literal-expression:
    @{ new-lines~opt~ hash-literal-body~opt~ new-lines~opt~ }

hash-literal-body:
    hash-entry
    hash-literal-body statement-terminators hash-entry

hash-entry:
    key-expression = new-lines~opt~ statement

key-expression:
    simple-name
    unary-expression

statement-terminators:
    statement-terminator
    statement-terminators statement-terminator

statement-terminator:
    ;
    new-line-character

説明:

hash-literal-expression は、キーと値のペアである 0 個以上の要素のハッシュテーブル (§10) を作成するために使用されます。

キーには、null 型を除く任意の型を指定できます。 関連付けられた値には、null 型を含む任意の型を含め、それらの各値には、$nullを含む、目的の値を指定する任意の式を指定できます。

キーと値のペアの順序は重要ではありません。

例:

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$last = "Anderson"; $IDNum = 120
$h2 = @{ FirstName = "James"; LastName = $last; IDNum = $IDNum + 3 }
$h3 = @{ }
$h4 = @{ 10 = "James"; 20.5 = "Anderson"; $true = 123 }

2 つのハッシュテーブル ($h1$h2) を作成します。それぞれに 3 つのキーと値のペアと、空の 3 つ目の $h3が含まれています。 ハッシュテーブル $h4 には、さまざまな種類のキーがあります。

7.1.10 型リテラル式

構文:

type-literal:
    [ type-spec ]

type-spec:
    array-type-name new-lines~opt~ dimension~opt~ ]
    generic-type-name new-lines~opt~ generic-type-arguments ]
    type-name

dimension:
    ,
    dimension ,

generic-type-arguments:
    type-spec new-lines~opt~
    generic-type-arguments , new-lines~opt~ type-spec

array-type-name:
    type-name [

generic-type-name:
    type-name [

説明:

型リテラル は、何らかの指定されていない 基になる型 によって実装で表されます。 その結果、型名は基になる型のシノニムになります。

型リテラルは、さまざまなコンテキストで使用されます。

  • 明示的な変換の指定 (§6、§7.2.9)
  • 型制約配列の作成 (§9.4)
  • オブジェクトの静的メンバーへのアクセス (§7.1.2)
  • 変数 (§5.3) または関数パラメーター (§8.10.2) に対する型制約の指定

例:

[int].IsPrimitive        # $true
[Object[]].FullName      # "System.Object[]"
[int[,,]].GetArrayRank() # 3

文字列を保持するために特殊化されたジェネリック スタック型 (§4.4) は [Stack[string]]として書き込まれ、関連付けられた文字列値を持つ int キーを保持するために特殊化されたジェネリック ディクショナリ型は、[Dictionary[int,string]]として書き込まれる場合があります。

"型リテラル" の型は、System.Type です。 上記で提案 Stack[string] 型の完全な名前は System.Collections.Generic.Stack[int]です。 上記で提案 Dictionary[int,string] 型の完全な名前は System.Collections.Generic.Dictionary[int,string]です。

7.2 単項演算子

構文:

unary-expression:
    primary-expression
    expression-with-unary-operator

expression-with-unary-operator:
    , new-lines~opt~ unary-expression
    -not new-lines~opt~ unary-expression
    ! new-lines~opt~ unary-expression
    -bnot new-lines~opt~ unary-expression
    + new-lines~opt~ unary-expression
    dash new-lines~opt~ unary-expression
    pre-increment-expression
    pre-decrement-expression
    cast-expression
    -split new-lines~opt~ unary-expression
    -join new-lines~opt~ unary-expression

pre-increment-expression:
    ++ new-lines~opt~ unary-expression

pre-decrement-expression:
    dashdash new-lines~opt~ unary-expression

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

cast-expression:
    type-literal unary-expression

dashdash:
    dash dash

7.2.1 単項コンマ演算子

説明:

コンマ演算子 (,) は、1 つの要素を持つ制約のない 1 次元配列 作成します。その型と値は単項式の型と値です。

この演算子は正しい連想演算子です。

例:

$a = ,10         # create an unconstrained array of 1 element, $a[0],
                 # which has type int

$a = ,(10,"red") # create an unconstrained array of 1 element,
$a[0],
                 # which is an unconstrained array of 2 elements,
                 # $a[0][0] an int, and $a[0][1] a string

$a = ,,10        # create an unconstrained array of 1 element, which is
                 # an unconstrained array of 1 element, which is an int
                 # $a[0][0] is the int. Contrast this with @(@(10))

7.2.2 論理 NOT

構文:

logical-not-operator:
    dash not

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

演算子は、単項式 指定された値を、必要に応じて bool 型 (§6.2) に変換し、その型の結果を生成します。 "単項式" の値は True の場合、結果は False です。その逆も同様です。 演算子 ! は、-notの代替スペル です。

この演算子は正しい連想演算子です。

例:

-not $true         # False
-not -not $false   # False
-not 0             # True
-not 1.23          # False
!"xyz"             # False

7.2.3 ビット演算 NOT

構文:

bitwise-not-operator:
    dash bnot

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

演算子は、必要に応じて、単項式 指定された値を整数型 (§6.4) に変換します。 変換後の値を int 型で表すことができる場合は、結果の型になります。 それ以外の場合、変換後の値を long 型で表すことができる場合は、結果の型になります。 それ以外の場合、式の形式が正しくありません。 結果として得られる値は、変換された値の 1 の補数になります。

この演算子は正しい連想演算子です。

例:

-bnot $true         # int with value 0xFFFFFFFE
-bnot 10            # int with value 0xFFFFFFF5
-bnot 2147483648.1  # long with value 0xFFFFFFFF7FFFFFFF
-bnot $null         # int with value 0xFFFFFFFF
-bnot "0xabc"       # int with value 0xFFFFF543

7.2.4 単項プラス

説明

+ unary-expression 形式の式は、0 + unary-expression として書き込まれたかのように扱われます (§7.7)。 整数リテラル 0 は型が intです。

この演算子は正しい連想演算子です。

例:

+123L         # type long, value 123
+0.12340D     # type decimal, value 0.12340
+"0xabc"      # type int, value 2748

7.2.5 単項マイナス

説明:

- unary-expression 形式の式は、0 - unary-expression として書き込まれたかのように扱われます (§7.7)。 整数リテラル 0 の型は intです。 マイナス演算子には、§7.2 に記載されているダッシュ文字のいずれかを指定できます。

この演算子は正しい連想演算子です。

例:

-$true     # type int, value -1
-123L      # type long, value -123
-0.12340D  # type decimal, value -0.12340

7.2.6 プレフィックスインクリメント演算子とデクリメント演算子

説明:

単項式 は、数値型 (§4) または値 $nullを持つ書き込み可能な場所を指定する必要があります。 単項式 によって指定された値が $null場合、単項式の値は、演算子が評価される前に int 型に変換され、値は 0 に置き換えられます。

手記

単項式 によって指定された値の型は、結果の格納時に変更される可能性があります。 割り当てによる型の変更については、§7.11 を参照してください。

プレフィックスインクリメント演算子 の場合、単項式 値は、適切な型の だけインクリメントされます。 結果は、インクリメントが行われた後の新しい値です。 式 ++E は、E += 1 (§7.11.2) と同じです。

プレフィックスデクリメント演算子 -- の場合、単項式 の値は、適切な型の 1 によってデクリメントされます。 結果は、減分が行われた後の新しい値になります。 式 --E は、E -= 1 (§7.11.2) と同じです。 プレフィックス デクリメント演算子には、§7.2dashdash パターンに一致する任意のパターンを指定できます。

これらの演算子は右結合性を持つ。

例:

$i = 0                # $i = 0
++$i                  # $i is incremented by 1
$j = --$i             # $i is decremented then $j takes on the value of $i

$a = 1,2,3
$b = 9,8,7
$i = 0;
$j = 1
$b[--$j] = $a[++$i]   # $j is # decremented, $i incremented, then $b[0]
                      # takes on the value of $a[1]

$i = 2147483647       # $i holds a value of type int
++$i                  # $i now holds a value of type double because
                      # 2147483648 is too big to fit in type int

[int]$k = 0           # $k is constrained to int
$k = [int]::MinValue  # $k is set to -2147483648
--$k                  # -2147483649 is too small to fit, imp-def behavior

$x = $null            # target is unconstrained, $null goes to [int]0
--$x                  # value treated as int, 0 becomes -1

7.2.7 単項 -join 演算子

構文:

join-operator:
    dash join

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

単項 演算子は、単項式によって指定された 1 つ以上のオブジェクトの値 連結された文字列を生成します。 (区切り記号は、この演算子のバイナリ バージョン (§7.8.4.4) を使用して挿入できます)。

単項式には、スカラー値またはコレクションを指定できます。

例:

-join (10, 20, 30)             # result is "102030"
-join (123, $false, 19.34e17)  # result is "123False1.934E+18"
-join 12345                    # result is "12345"
-join $null                    # result is ""

7.2.8 単項 -split 演算子

構文:

split-operator:
    dash split

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

単項 演算子は、単項式によって指定された 1 つ以上の文字列 分割し、制約付き 1 次元配列内のサブパーツを返します。 連続する空白文字のグループは、連続するサブパーツ間の区切り記号として扱われます。 明示的な区切り記号文字列は、この演算子のバイナリ バージョン (§7.8.4.5) またはその 2 つのバリアント (§7.8) を使用して指定できます。

区切り記号テキストは、結果の文字列には含まれません。 入力文字列の先頭と末尾の空白は無視されます。 入力文字列が空であるか、空白のみを含む場合、それは空の1つの文字列から成る配列になります。

単項式はスカラー値または文字列の配列を指定できます。

例:

-split " red`tblue`ngreen " # 3 strings: "red", "blue", "green"
-split ("yes no", "up down") # 4 strings: "yes", "no", "up", "down"
-split " " # 1 (empty) string

7.2.9 キャスト演算子

説明:

この演算子は、単項式 によって指定された値 明示的に (§6) を、型リテラル (§7.1.10) で指定された型に変換します。 型リテラル が void 以外の場合、結果の型は名前付き型になり、値は変換後の値になります。 型リテラル が void の場合、オブジェクトはパイプラインに書き込まれず、結果はありません。

任意の型の式が同じ型にキャストされると、結果の型と値は 単項式の型と値になります。

この演算子は正しい連想演算子です。

例:

[bool]-10        # a bool with value True
[int]-10.70D     # a decimal with value -10
[int]10.7        # an int with value 11
[long]"+2.3e+3"  # a long with value 2300
[char[]]"Hello"  # an array of 5 char with values H, e, l, l, and o.

7.3 バイナリコンマ演算子

構文:

array-literal-expression:
    unary-expression , new-lines~opt~ array-literal-expression

説明:

二項コンマ演算子は、1 次元配列を作成します。この配列の要素は、構文上の順序でオペランドによって指定された値です。 配列には制約のない型があります。

例:

2,4,6                    # Length 3; values 2,4,6
(2,4),6                  # Length 2; values [object[]],int
(2,4,6),12,(2..4)        # Length 3; [object[]],int,[object[]]
2,4,6,"red",$null,$true  # Length 6

特定のバイナリ コンマ式にグループ化かっこを追加しても、既定の優先順位は文書化されません。代わりに、結果が変更されます。

7.4 範囲演算子

構文:

range-expression:
    unary-expression .. new-lines~opt~ unary-expression

説明:

範囲式 では、制約のない 1 次元配列が作成されます。その要素は、範囲の境界で指定された int シーケンスの値です。 オペランドによって指定された値は、必要に応じて intに変換されます (§6.4)。 変換後の下限値を指定するオペランドは 下限であり、変換後に高い値を指定するオペランドは 上限です。 どちらの境界も同じでもかまいません。その場合、結果の配列の長さは 1。 左オペランドが下限を指定する場合、シーケンスは昇順になります。 左オペランドが上限を指定する場合、シーケンスは降順になります。

概念的には、この演算子は、対応するバイナリ コンマ演算子シーケンスのショートカットです。 たとえば、範囲 5..8 は、5,6,7,8を使用して生成することもできます。 ただし、配列を持たずに昇順または降順のシーケンスが必要な場合、実装では実際の配列の生成を回避できます。 たとえば、foreach ($i in 1..5) { ... }では、配列を作成する必要はありません。

範囲式 を使用して、配列スライス (§9.9) を指定できます。

例:

1..10        # ascending range 1..10
-495..-500   # descending range -495..-500
16..16       # sequence of 1

$x = 1.5
$x..5.40D    # ascending range 2..5

$true..3     # ascending range 1..3
-2..$null    # ascending range -2..0
0xf..0xa     # descending range 15..10

7.5 書式演算子

構文:

format-expression:
    format-specification-string format-operator new-lines~opt~ range-expression

format-operator:
    dash f

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

書式指定式 は、範囲式 で指定された 1 つ以上の値を、書式指定文字列 に従って、書式指定式でフォーマットします。 範囲式 によって指定 値の位置には、0 から始まり、字句の順序で増加する番号が付けられます。 結果の型は stringです。

書式指定文字列には、それぞれ次の形式を持つ 0 個以上の書式指定を含めることができます。

{N [ ,M ][ : FormatString ]}

N は、範囲式 値の位置 (必須) を表し、M は (省略可能) 最小表示幅を表し、FormatString は (省略可能) 形式を示します。 書式設定された値の幅が指定した幅を超える場合は、それに応じて幅が増加します。 FormatString で位置が参照されていない値は、副作用の評価後に無視されます。 N が存在しない位置を参照している場合、動作は実装定義されます。 $null 型と void 型の値は、空の文字列として書式設定されます。 配列は、サブ式 (§7.1.6) のようにフォーマットされます。 書式指定に { 文字と } 文字を書式区切り記号として解釈せずに含めるには、それぞれ {{ および }}として書き込みます。

フォーマット仕様の完全な定義については、Ecma 技術レポート TR/84のタイプ System.IFormattable を参照してください。

例:

"__{0,3}__" -f 5                         # __ 5__
"__{0,-3}__" -f 5                        # __5 __
"__{0,3:000}__" -f 5                     # __005__
"__{0,5:0.00}__" -f 5.0                  # __ 5.00__
"__{0:C}__" -f 1234567.888               # __$1,234,567.89__
"__{0:C}__" -f -1234.56                  # __($1,234.56)__
"__{0,12:e2}__" -f 123.456e2             # __ 1.23e+004__
"__{0,-12:p}__" -f -0.252                # __-25.20 % __

$i = 5; $j = 3
"__{0} + {1} <= {2}__" -f $i,$j,($i+$j)  # __5 + 3 <= 8__

$format = "__0x{0:X8}__"
$format -f 65535                         # __0x0000FFFF__

書式指定では、N が存在しない位置を参照している場合、FormatError が発生します。

7.6 乗法演算子

構文:

multiplicative-expression:
    multiplicative-expression * new-lines~opt~ format-expression
    multiplicative-expression / new-lines~opt~ format-expression
    multiplicative-expression % new-lines~opt~ format-expression

7.6.1 乗算

説明:

乗算演算子 * の結果は、通常の算術変換 (§6.15) が適用された後の 2 つのオペランドによって指定された値の積です。

この演算子は連想的なままです。

例:

12 * -10L      # long result -120
-10.300D * 12  # decimal result -123.600
10.6 * 12      # double result 127.2
12 * "0xabc"   # int result 32976

7.6.2 文字列レプリケーション

説明:

左オペランドが文字列を指定すると、二項 演算子は、左オペランドで指定されたものを含む新しい文字列を作成し、右オペランドの値で指定された回数を整数型 (§6.4) にレプリケートします。

この演算子は連想的なままです。

例:

"red" * "3"       # string replicated 3 times
"red" * 4         # string replicated 4 times
"red" * 0         # results in an empty string
"red" * 2.3450D   # string replicated twice
"red" * 2.7       # string replicated 3 times

7.6.3 配列レプリケーション

説明:

左オペランドが配列を指定すると、二項 演算子は、左オペランドで指定された値を含む新しい制約のない 1 次元配列を作成し、右オペランドの値で指定された回数を整数型 (§6.4) にレプリケートします。 レプリケーション数が 0 の場合、長さ 1 の配列になります。 左オペランドが多次元配列を指定する場合は、使用される前にフラット化 (§9.12) されます。

この演算子は連想的なままです。

例:

$a = [int[]](10,20)              # [int[]], Length 2*1
$a * "3"                         # [object[]], Length 2*3
$a * 4                           # [object[]], Length 2*4
$a * 0                           # [object[]], Length 2*0
$a * 2.3450D                     # [object[]], Length 2*2
$a * 2.7                         # [object[]], Length 2*3
(New-Object 'float[,]' 2,3) * 2  # [object[]], Length 2*2

7.6.4 除算

説明:

除算演算子 / の結果は、通常の算術変換 (§6.15) が適用された後に、左オペランドで指定された値を右オペランドで指定された値で除算した場合の商です。

整数または 0 による 10 進除算を実行しようとすると、実装定義の終了エラーが発生します。

この演算子は連想的なままです。

例:

10/-10      # int result -1
12/-10      # double result -1.2
12/-10D     # decimal result 1.2
12/10.6     # double result 1.13207547169811
12/"0xabc"  # double result 0.00436681222707424

整数または 0 で 10 進数の除算を実行しようとすると、RuntimeException 例外が発生します。

7.6.5 剰余

説明:

剰余演算子 % の結果は、通常の算術変換 (§6.15) が適用された後、左オペランドで指定された値を右オペランドで指定された値で除算した場合の剰余です。

整数または 0 による 10 進除算を実行しようとすると、実装定義の終了エラーが発生します。

例:

10 % 3          # int result 1
10.0 % 0.3      # double result 0.1
10.00D % "0x4"  # decimal result 2.00

整数または 0 で 10 進数の除算を実行しようとすると、RuntimeException 例外が発生します。

7.7 加法演算子

構文:

additive-expression:
    primary-expression + new-lines~opt~ expression
    primary-expression dash new-lines~opt~ expression

dash: one of
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

7.7.1 追加

説明:

加算演算子 + の結果は、通常の算術変換 (§6.15) が適用された後に 2 つのオペランドによって指定された値の合計です。

この演算子は連想的なままです。

例:

12 + -10L       # long result 2
-10.300D + 12   # decimal result 1.700
10.6 + 12       # double result 22.6
12 + "0xabc"    # int result 2760

7.7.2 文字列連結

説明:

左オペランドが文字列を指定すると、バイナリ + 演算子は、左オペランドで指定された値を含む新しい文字列を作成し、その直後に右オペランドで指定された値を文字列型に変換します (§6.8)。

この演算子は連想的なままです。

例:

"red" + "blue"      # "redblue"
"red" + "123"       # "red123"
"red" + 123         # "red123"
"red" + 123.456e+5  # "red12345600"
"red" + (20,30,40)  # "red20 30 40"

7.7.3 配列の結合

説明:

左オペランドが配列を指定すると、二項 + 演算子は、左オペランドで指定された要素の後に右オペランドで指定された値が続く新しい制約のない 1 次元配列を作成します。 いずれかのオペランドに存在する多次元配列は、使用される前にフラット化 (§9.12) されます。

この演算子は連想的なままです。

例:

$a = [int[]](10,20)               # [int[]], Length 2
$a + "red"                        # [object[]], Length 3
$a + 12.5,$true                   # [object[]], Length 4
$a + (New-Object 'float[,]' 2,3)  # [object[]], Length 8
(New-Object 'float[,]' 2,3) + $a  # [object[]], Length 8

7.7.4 ハッシュテーブル連結

説明:

両方のオペランドが Hashtable を指定する場合、バイナリ + 演算子は、左オペランドで指定された要素の直後に右オペランドで指定された要素を含む新しい Hashtable を作成します。

ハッシュテーブルに同じキーが含まれている場合は、実装定義の終了エラーが発生します。

この演算子は連想的なままです。

例:

$h1 = @{ FirstName = "James"; LastName = "Anderson" }
$h2 = @{ Dept = "Personnel" }
$h3 = $h1 + $h2      # new Hashtable, Count = 3

ハッシュテーブルに同じキーが含まれている場合は、BadOperatorArgument 型の例外が発生します。

7.7.5 減算

説明:

減算演算子 - の結果は、通常の算術変換 (§6.15) が適用された後に左オペランドで指定された値から右オペランドで指定された値を減算した場合の差です。 減算演算子には、§7.7に記載されている ダッシュ 文字のいずれかを指定できます。

この演算子は連想的なままです。

例:

12 - -10L      # long result 22
-10.300D - 12  # decimal result -22.300
10.6 - 12      # double result -1.4
12 - "0xabc"   # int result -2736

7.8 比較演算子

構文:

comparison-expression:
    primary-expression comparison-operator new-lines~opt~ expression

comparison-operator:
    equality-operator
    relational-operator
    containment-operator
    type-operator
    like-operator
    match-operator

説明:

左オペランドで指定された値の型は、比較が行われる前に、必要に応じて右オペランドで指定された値 (§6) を変換する方法を決定します。

一部の比較演算子には、大文字と小文字を区別するバリアント (-c<operator>) と大文字と小文字を区別しないバリアント (-i<operator>) の 2 つがあります。 -<operator> のバージョンは、-i<operator>と同じです。 大文字と小文字の区別は、文字列型の値の比較でのみ意味があります。 文字列以外の比較コンテキストでは、2 つのバリアントは同じように動作します。

これらの演算子は連想的なままです。

7.8.1 等値演算子と関係演算子

構文:

equality-operator: one of
    dash eq     dash ceq    dash ieq
    dash ne     dash cne    dash ine

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

relational-operator: one of
    dash lt     dash clt    dash ilt
    dash le     dash cle    dash ile
    dash gt     dash cgt    dash igt
    dash ge     dash cge    dash ige

説明:

等値演算子には、等値 (-eq) と不等値 (-ne) の 2 つがあります。および 4 つの関係演算子: less-than (-lt)、less-than-or-equal-to (-le)、greater-than (-gt)、および greater-than-or-equal-to (-ge)。 これらのそれぞれには、2 つのバリアント (§7.8) があります。

2 つの文字列を等しく比較するには、長さと内容が同じで、必要に応じて文字の大文字と小文字を区別する必要があります。

左オペランドによって指定された値がコレクションでない場合、結果の型は bool。 それ以外の場合、結果は、右オペランドで指定された値と比較した場合に True をテストするコレクションの要素を含む空の制約のない 1 次元配列である可能性があります。

例:

10 -eq "010"           # True, int comparison
"010" -eq 10           # False, string comparison
"RED" -eq "Red"        # True, case-insensitive comparison
"RED" -ceq "Red"       # False, case-sensitive comparison
"ab" -lt "abc"         # True

10,20,30,20,10 -ne 20  # 10,30,10, Length 3
10,20,30,20,10 -eq 40  # Length 0
10,20,30,20,10 -ne 40  # 10,20,30,20,10, Length 5
10,20,30,20,10 -gt 25  # 30, Length 1
0,1,30 -ne $true       # 0,30, Length 2
0,"00" -eq "0"         # 0 (int), Length 1

7.8.2 コンテインメント演算子

構文:

containment-operator: one of
    dash contains       dash ccontains      dash icontains
    dash notcontains    dash cnotcontains   dash inotcontains
    dash in             dash cin            dash iin
    dash notin          dash cnotin         dash inotin

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

containment 演算子には、次の 4 つの包含演算子があります。contains (-contains)、does-not-contain (-notcontains)、in (-in) 、not-in (-notin)。 これらのそれぞれには、2 つのバリアント (§7.8) があります。

包含演算子は、配列の要素で値が少なくとも 1 回発生する (または発生しない) かどうかを示すブール型の結果を返します。 -contains-notcontainsでは、値は右オペランドによって指定され、配列は左オペランドによって指定されます。 -in と -notinでは、オペランドが逆になります。 値は左オペランドで指定され、配列は右オペランドによって指定されます。

これらの演算子の目的上、配列オペランドにスカラー値がある場合、スカラー値は 1 つの要素の配列として扱われます。

例:

10,20,30,20,10 -contains 20     # True
10,20,30,20,10 -contains 42.9   # False
10,20,30 -contains "10"         # True
"10",20,30 -contains 10         # True
"010",20,30 -contains 10        # False
10,20,30,20,10 -notcontains 15  # True
"Red",20,30 -ccontains "RED"    # False

7.8.3 型テストおよび変換演算子

構文:

type-operator: one of
    dash is
    dash as

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

型演算子 -is は、左オペランドによって指定された値が型を持っているか、または右オペランドによって指定された型を持つ型から派生しているかをテストします。 右側のオペランドは、型または型に変換できる値 (型に名前を付ける文字列など) を指定する必要があります。 結果の型は boolです。 型演算子 -isnot は、対応する -is フォームの論理否定を返します。

型演算子 -as は、左オペランドで指定された値を右オペランドで指定された型に変換しようとします。 右側のオペランドは、型または型に変換できる値 (型に名前を付ける文字列など) を指定する必要があります。 変換が失敗した場合は、$null が返されます。それ以外の場合は、変換された値が返され、その結果の戻り値の型は変換後の値のランタイム型になります。

例:

$a = 10            # value 10 has type int
$a -is [int]       # True

$t = [int]
$a -isnot $t       # False
$a -is "int"       # True
$a -isnot [double] # True

$x = [int[]](10,20)
$x -is [int[]]     # True

$a = "abcd"        # string is derived from object
$a -is [object]    # True

$x = [double]
foreach ($t in [int],$x,[decimal],"string") {
    $b = (10.60D -as $t) * 2  # results in int 22, double 21.2
}                             # decimal 21.20, and string "10.6010.60"

7.8.4 パターンマッチングとテキスト操作演算子

7.8.4.1 -like 演算子と -notlike 演算子

構文:

like-operator: one of
    dash like       dash clike      dash ilike
    dash notlike    dash cnotlike   dash inotlike

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

左オペランドがコレクションを指定しない場合、結果の型は boolです。 それ以外の場合、結果は、右オペランドで指定された値と比較した場合に True をテストするコレクションの要素を含む空の制約のない 1 次元配列である可能性があります。 右オペランドは、ワイルドカード式 (§3.15) を含む文字列を指定できます。 これらの演算子には、2 つのバリアント (§7.8) があります。

例:

"Hello" -like "h*"                   # True, starts with h
"Hello" -clike "h*"                  # False, does not start with lowercase h
"Hello" -like "*l*"                  # True, has an l in it somewhere
"Hello" -like "??l"                  # False, no length match

"-abc" -like "[-xz]*"                # True, - is not a range separator
"#$%\^&" -notlike "*[A-Za-z]"        # True, does not end with alphabetic character
"He" -like "h[aeiou]?*"              # False, need at least 3 characters
"When" -like "*[?]"                  # False, ? is not a wildcard character
"When?" -like "*[?]"                 # True, ? is not a wildcard character

"abc","abbcde","abcgh" -like "abc*"  # object[2], values
"abc" and "abcgh"

7.8.4.2 -match 演算子と -notmatch 演算子

構文:

match-operator: one of
    dash match      dash cmatch     dash imatch
    dash notmatch   dash cnotmatch  dash inotmatch

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

左側のオペランドがコレクションを指定しない場合、結果は型 bool を持ち、その結果が $trueの場合、Hashtable $matches の要素は、右側のオペランドによって指定された値と一致する (または一致しない) 文字列に設定されます。 それ以外の場合、結果は、右オペランドで指定された値と比較してテストが True となったコレクションの要素を含む、空かもしれない制約のない1次元の配列になる可能性がありますが、$matches は設定されません。 右側のオペランドは、正規表現 (§3.16) を含む文字列を指定できます。この場合、パターンと呼ばれます。 これらの演算子には、2 つのバリアント (§7.8) があります。

これらの演算子は、サブマッチ (§7.8.4.6) をサポートします。

例:

"Hello" -match ".l"                    # True, $matches key/value is 0/"el"
"Hello" -match '\^h.*o$'               # True, $matches key/value is
0/"Hello"
"Hello" -cmatch '\^h.*o$'              # False, $matches not set
"abc\^ef" -match ".\\\^e"              # True, $matches key/value is 0/"c\^e"

"abc" -notmatch "[A-Za-z]"             # False
"abc" -match "[\^A-Za-z]"              # False
"He" -match "h[aeiou]."                # False, need at least 3 characters
"abc","abbcde","abcgh" -match "abc.*"  # Length is 2, values "abc", "abcgh"

7.8.4.3 -replace 演算子

構文:

binary-replace-operator: one of
    dash replace    dash creplace   dash ireplace

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

-replace 演算子を使用すると、右オペランドで指定された値を使用して、左オペランドで指定された 1 つ以上の文字列でテキストを置換できます。 この演算子には、2 つのバリアント (§7.8) があります。 右側のオペランドには、次のいずれかの形式があります。

  • 検索する文字列。正規表現 (§3.16) を含む場合があります。 この場合、置換文字列は暗黙的に "" になります。
  • 検索する文字列を含む 2 つのオブジェクトの配列。その後に置換文字列が続きます。

左側のオペランドが文字列を指定する場合、結果は文字列型になります。 左オペランドが文字列の 1 次元配列を指定する場合、結果は制約のない 1 次元配列になります。その長さは左オペランドの配列の場合と同じで、置換が完了した後に入力文字列が含まれます。

この演算子は、サブマッチ (§7.8.4.6) をサポートします。

例:

"Analogous","an apple" -replace "a","*"      # "*n*logous","*n *pple"
"Analogous" -creplace "[aeiou]","?"          # "An?l?g??s"
"Analogous","an apple" -replace '\^a',"%%A"  # "%%Analogous","%%An apple"
"Analogous" -replace "[aeiou]",'$&$&'        # "AAnaaloogoouus"

7.8.4.4 二項 -join 演算子

構文:

binary-join-operator: one of
    dash join

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

バイナリ -join 演算子は、必要に応じて、文字列 (§6.7) に変換された後に左オペランドによって指定された 1 つ以上のオブジェクトの値を連結した文字列を生成します。 右側のオペランドによって指定された文字列は、結果の文字列内の (空の可能性がある) 値を区切るために使用されます。

左オペランドには、スカラー値またはコレクションを指定できます。

例:

(10, 20, 30) -join "\|"    # result is "10\|20\|30"
12345 -join ","            # result is "12345", no separator needed
($null,$null) -join "<->"  # result is "<->", two zero-length values

7.8.4.5 二項 -split 演算子

構文:

binary-split-operator: one of
    dash split      dash csplit     dash isplit

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

二項 -split 演算子は、左オペランドで指定された 1 つ以上の文字列を分割し、そのサブパーツを文字列の制約付き 1 次元配列に返します。 この演算子には、2 つのバリアント (§7.8) があります。 左オペランドは、スカラー値または文字列の配列を指定できます。 右側のオペランドには、次のいずれかの形式があります。

  • "区切り文字"
  • 区切り記号文字列の後に数値 と分割数 が続く2つのオブジェクトからなる配列
  • 区切り文字、数値の分割カウント、"オプション文字列" を含む 3 つのオブジェクトの配列
  • スクリプト ブロック
  • 2つのオブジェクトからなる配列であり、それぞれがスクリプトブロックと、その後に続く数値の分割カウントを含む

区切り記号文字列には、正規表現 (§3.16) を含む場合があります。 これは、入力文字列を含むサブパーツを検索するために使用されます。 区切り記号は、結果の文字列には含まれません。 左側のオペランドが空の文字列を指定すると、空の文字列要素になります。 区切り記号文字列が空の文字列の場合は、入力文字列内のすべての文字位置にあります。

既定では、入力文字列のすべてのサブパーツが個別の要素として結果に配置されます。ただし、分割カウントを使用してこの動作を変更できます。 その数が負、0、または入力文字列内のサブパーツの数以上の場合、各サブパーツは個別の要素に入ります。 そのカウントが入力文字列内のサブパーツの数より少ない場合、結果には count 要素があり、最後の要素には最初の カウントを超えるすべてのサブパーツが含まれます。1 サブパーツです。

オプション文字列には、0 個以上の オプション名があり、各隣接するペアはコンマで区切られています。 先頭、末尾、埋め込み空白は無視されます。 オプション名は任意の順序で指定でき、大文字と小文字が区別されます。

オプション文字列に SimpleMatchオプション名が含まれている場合は、IgnoreCaseオプション名を含めることもできます。 オプション文字列に RegexMatch が含まれているか、または RegexMatch もしくは SimpleMatchのいずれも含まれていない場合は、SimpleMatchを除く任意のオプション名を含めることができます。 ただし、複数行単一行の両方を含めてはなりません。

オプション名のセットを次に示します。

オプション 説明
カルチャーインバリアント 区切り記号を評価するときに、言語のカルチャの違いを無視します。
ExplicitCapture 結果一覧で明示的なキャプチャ グループのみが返されるように、名前のない一致グループを無視します。
IgnoreCase -csplit が使用されている場合でも、大文字と小文字を区別しない照合を強制します。
IgnorePatternWhitespace エスケープされていない空白文字と、番号記号 (#) でマークされたコメントを無視します。
Multiline このモードは、行と文字列の開始と終了を認識します。 既定のモードは 単一行です。
RegexMatch 正規表現の一致を使用して区切り記号を評価します。 これが既定値です。
SimpleMatch 区切り記号を評価するときは、単純な文字列比較を使用します。
Singleline このモードでは、文字列の開始と終了のみが認識されます。 これは既定のモードです。

スクリプト ブロック (§7.1.8) は、区切り記号を決定するための規則を指定し、bool 型に評価する必要があります。

例:

"one,forty two,," -split ","              # 5 strings: "one" "forty two" "" ""

"abc","de" -split ""                      # 9 strings: "" "a" "b" "c" "" "" "d" "e" ""

"ab,cd","1,5,7,8" -split ",", 2           # 4 strings: "ab" "cd" "1" "5,7,8"

"10X20x30" -csplit "X", 0, "SimpleMatch"  # 2 strings: "10" "20x30"

"analogous" -split "[AEIOU]", 0, "RegexMatch, IgnoreCase"
                                          # 6 strings: "" "n" "l" "g" "" "s"

"analogous" -split { $_ -eq "a" -or $_ -eq "o" }, 4
                                          # 4 strings: "" "n" "l" "gous"

7.8.4.6 サブマッチ

-match-notmatch、および -replace で一致するパターンには、かっこで区切られたサブパーツ (サブマッチと呼ばれます) が含まれている場合があります。 次の例を考えてみましょう。

"red" -match "red"

結果は $true され、$matches のキー 0 に "red" が含まれます。この部分は、右オペランドで指定されたパターンと完全に一致する左オペランドによって指定された文字列の部分です。

次の例では、パターン全体がサブマッチです。

"red" -match "(red)"

前と同様に、キー 0 には "red" が含まれています。ただし、キー 1 には "red" も含まれています。これは、サブマッチと完全に一致する左オペランドによって指定された文字列の一部です。

次のより複雑なパターンについて考えてみましょう。

"red" -match "((r)e)(d)"

このパターンでは、"re"、"r"、"d"、または "red" のサブマッチが可能になります。

ここでも、キー 0 には "red" が含まれています。 キー 1 に "re" が含まれており、キー 2 に "r" が含まれており、キー 3 に "d" が含まれています。 キーと値のペアはパターン内で左から右の順に一致しており、文字列の一致は長いものが短いものより優先されます。

-replaceの場合、置換テキストは $nの形式で命名された識別子を通して、サブマッチにアクセスできます(最初の一致が $1、2 番目が $3、その後も続きます)。 例えば

"Monday morning" -replace '(Monday|Tuesday) (morning|afternoon|evening)','the $2 of $1'

結果の文字列は "月曜日の朝" です。

キーを $matches の中で 0 から始まるインデックスにする代わりに、?<*name*>形式を使用してサブマッチに名前を付けることができます。 たとえば、"((r)e)(d)" は、次のように3つの名前付きサブマッチである m1m2m3を使用して、次の形式で書き込むことができます: "(?<m1>(?<m2>r)e)(?<m3>d)"

7.8.5 シフト演算子

構文:

shift-operator: one of
    dash shl
    dash shr

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

説明:

shift left (-shl) 演算子と shift right (-shr) 演算子は、左側のオペランドによって設計された値を整数型に変換し、必要に応じて、通常の算術変換 (§6.15) を使用して右オペランドで指定された値を int に変換します。

左シフト演算子は、次に説明するように計算されたビット数だけ左オペランドを左にシフトします。 下位の空のビット位置は 0 に設定されます。

右シフト演算子は、次に説明するように計算されたビット数だけ左オペランドを右にシフトします。 左オペランドの下位ビットは破棄され、残りのビットは右にシフトされます。 左オペランドが符号付き値の場合、左オペランドが負でない場合は上位の空ビット位置が 0 に設定され、左オペランドが負の場合は 1 に設定されます。 左オペランドが符号なし値の場合、上位の空のビット位置は 0 に設定されます。

左オペランドに int 型がある場合、シフトカウントは右オペランドの下位 5 ビットによって与えられます。 右オペランドに long 型がある場合、シフトカウントは右オペランドの下位 6 ビットによって与えられます。

例:

0x0408 -shl 1             # int with value 0x0810
0x0408 -shr 3             # int with value 0x0081
0x100000000 -shr 0xfff81  # long with value 0x80000000

7.9 ビット演算子

構文:

bitwise-expression:
    unary-expression -band new-lines~opt~ unary-expression
    unary-expression -bor new-lines~opt~ unary-expression
    unary-expression -bxor new-lines~opt~ unary-expression

説明:

ビットごとの AND 演算子 -band、ビットごとの OR 演算子 -bor、ビットごとの XOR 演算子 -bxor、必要に応じて、通常の算術変換 (§6.15) を使用して、オペランドで指定された値を整数型に変換します。 変換後、両方の値に結果の型である型 int がある場合。 それ以外の場合、両方の値の型が long の場合は、結果の型になります。 1 つの値の型が int 、もう一方の値の型が long の場合、結果の型は long になります。 それ以外の場合、式の形式が正しくありません。 結果は、変換された可能性のあるオペランド値のビットごとの AND、ビットごとの OR、またはビットごとの XOR になります。

これらの演算子は連想的なままです。 どちらのオペランドにも副作用が含まれていない場合、これらは可換です。

例:

0x0F0F -band 0xFE    # int with value 0xE
0x0F0F -band 0xFEL   # long with value 0xE
0x0F0F -band 14.6    # long with value 0xF

0x0F0F -bor 0xFE     # int with value 0xFFF
0x0F0F -bor 0xFEL    # long with value 0xFFF
0x0F0F -bor 14.40D   # long with value 0xF0F

0x0F0F -bxor 0xFE    # int with value 0xFF1
0x0F0F -bxor 0xFEL   # long with value 0xFF1
0x0F0F -bxor 14.40D  # long with value 0xF01
0x0F0F -bxor 14.6    # long with value 0xF00

7.10 論理演算子

構文:

logical-expression:
    unary-expression -and new-lines~opt~ unary-expression
    unary-expression -or new-lines~opt~ unary-expression
    unary-expression -xor new-lines~opt~ unary-expression

説明:

論理 AND 演算子 -and は、オペランドによって指定された値を、必要に応じて boolに変換します (§6.2)。 結果は、オペランド値が変換されている可能性がある論理 AND となり、型 boolです。 左オペランドが False に評価された場合、右オペランドは評価されません。

論理 OR 演算子 -or は、必要に応じて、オペランドで指定された値を boolに変換します (§6.2)。 結果は、変換された可能性があるオペランド値の論理 OR であり、型が bool。 左オペランドが True に評価された場合、右オペランドは評価されません。

論理 XOR 演算子 -xor、オペランドで指定された値を bool (§6.2) に変換します。 結果は、変換された可能性があるオペランド値の論理 XOR であり、型が bool

これらの演算子は連想的なままです。

例:

$j = 10
$k = 20
($j -gt 5) -and (++$k -lt 15)   # True -and False -> False
($j -gt 5) -and ($k -le 21)     # True -and True -> True
($j++ -gt 5) -and ($j -le 10)   # True -and False -> False
($j -eq 5) -and (++$k -gt 15)   # False -and True -> False

$j = 10
$k = 20
($j++ -gt 5) -or (++$k -lt 15)  # True -or False -> True
($j -eq 10) -or ($k -gt 15)     # False -or True -> True
($j -eq 10) -or (++$k -le 20)   # False -or False -> False

$j = 10
$k = 20
($j++ -gt 5) -xor (++$k -lt 15) # True -xor False -> True
($j -eq 10) -xor ($k -gt 15)    # False -xor True -> True
($j -gt 10) -xor (++$k -le 25)  # True -xor True -> False

7.11 代入演算子

構文:

assignment-expression:
    expression assignment-operator statement

assignment-operator: *one of
    =   dash =   +=   *=   /=   %=

説明:

代入演算子は、式で指定された書き込み可能な場所 値を格納します。 代入演算子 の説明については、§7.11.1参照してください。 その他すべての代入演算子については、§7.11.2を参照してください。

代入式には、代入が行われた後に 式によって指定された値があります。ただし、その代入式自体は書き込み可能な場所を指定しません。 式 型制約 (§5.3) の場合、その制約で使用される型は結果の型です。それ以外の場合、結果の型は、通常の算術変換 (§6.15) が適用された後の型になります。

この演算子は正しい連想演算子です。

7.11.1 単純な割り当て

説明

単純な代入 () では、ステートメントで指定された値は、で指定された書き込み可能な場所に格納されている値を置き換えます。 ただし、式 ハッシュテーブルに存在しないキーを指定した場合、そのキーは、ステートメントで指定された値に関連付けられた値を持つ Hashtable に追加されます。

文法で示されているように、 は、書き込み可能な場所のコンマ区切りのリストを指定できます。 これは、"複数の代入" と呼ばれます。 ステートメント は、1 つ以上のコンマ区切り値のリストを指定します。 いずれかのオペランド内のコンマは、複数の代入構文の一部であり、2 項コンマ演算子を表すものではありません。 値は、ステートメントによって指定されたリストから字句順に取得され、で指定された対応する書き込み可能な場所に格納されます。 ステートメント で指定されたリストの値が、式において書き込み可能な場所 よりも少ない場合、残りの場所は値 $nullになります。 "ステートメント" で指定されたリストに、"式" の書き込み可能な場所よりも多くの値がある場合、右端の "式" の場所を除くすべてが、対応する "ステートメント" 値になり、右端の "式" の場所は、残りのすべての "ステートメント" 値を要素として含む制約のない 1 次元配列になります。

値 (§8.1.2) を持つステートメントの場合、ステートメント がステートメントになることができます。

例:

$a = 20; $b = $a + 12L             # $b has type long, value 22
$hypot = [Math]::Sqrt(3*3 + 4*4)   # type double, value 5
$a = $b = $c = 10.20D              # all have type decimal, value 10.20
$a = (10,20,30),(1,2)              # type [object[]], Length 2
[int]$x = 10.6                     # type int, value 11
[long]$x = "0xabc"                 # type long, value 0xabc
$a = [float]                       # value type literal [float]
$i,$j,$k = 10,"red",$true          # $i is 10, $j is "red", $k is True
$i,$j = 10,"red",$true             # $i is 10, $j is [object[]], Length 2
$i,$j = (10,"red"),$true           # $i is [object[]], Length 2, $j is True
$i,$j,$k = 10                      # $i is 10, $j is $null, $k is $null

$h = @{}
[int] $h.Lower, [int] $h.Upper = -split "10 100"

$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.Dept = "Finance"               # adds element Finance
$h1["City"] = "New York"           # adds element City

[int]$Variable:v = 123.456         # v takes on the value 123
${E:output.txt} = "a"              # write text to the given file
$Env:MyPath = "x:\data\file.txt"   # define the environment variable
$Function:F = { param ($a, $b) "Hello there, $a, $b" }
F 10 "red"                         # define and invoke a function
function Demo { "Hi there from inside Demo" }
$Alias:A = "Demo"                  # create alias for function Demo
A                                  # invoke function Demo via the alias

7.11.2 複合代入

説明:

複合代入 の形式は E1 op= E2であり、複合代入の場合、式 E1 が 1 回だけ評価される点を除き、単純代入式 E1 = E1 op (E2) と同等です。 式 型制約 (§5.3) の場合、その制約で使用される型は結果の型です。それ以外の場合、結果の型は opによって決定されます。 については、§7.6.1§7.6.2§7.6.3を参照してください。については、§7.6.4を参照してください。については、§7.6.5を参照してください。については、§7.7.1§7.7.2§7.7.3を参照してください。については、§7.7.5を参照してください。

手記

数値型の制約のない値を指定するオペランドは、結果が格納されるときに代入演算子によって型が変更される可能性があります。

例:

$a = 1234; $a *= (3 + 2)  # type is int, value is 1234 * (3 + 2)
$b = 10,20,30             # $b[1] has type int, value 20
$b[1] /= 6                # $b[1] has type double, value 3.33...

$i = 0
$b = 10,20,30
$b[++$i] += 2             # side effect evaluated only once

[int]$Variable:v = 10     # v takes on the value 10
$Variable:v -= 3          # 3 is subtracted from v

${E:output.txt} = "a"     # write text to the given file
${E:output.txt} += "b"    # append text to the file giving ab
${E:output.txt} *= 4      # replicate ab 4 times giving abababab

7.12 リダイレクト演算子

構文:

pipeline:
    expression redirections~opt~ pipeline-tail~opt~
    command verbatim-command-argument~opt~ pipeline-tail~opt~

redirections:
    redirection
    redirections redirection

redirection:
    merging-redirection-operator
    file-redirection-operator redirected-file-name

redirected-file-name:
    command-argument
    primary-expression

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

説明:

リダイレクト演算子 > は、パイプラインから標準出力を受け取り、redirected-file-nameによって指定された場所にリダイレクトし、その場所の現在の内容を上書きします。

リダイレクト演算子 >> は、パイプラインから標準出力を取り出し、それを、"リダイレクト ファイル名" で指定される場所にリダイレクトして、その場所があれば、その現在の内容に追加します。 その場所が存在しない場合は、作成されます。

n> の形式を取るリダイレクト演算子は、パイプラインからストリーム n の出力を取り出し、それを、"リダイレクト ファイル名" で指定される場所にリダイレクトして、その場所の現在の内容を上書きします。

n>> の形式を取るリダイレクト演算子は、パイプラインからストリーム n の出力を取り出し、それを、"リダイレクト ファイル名" で指定される場所にリダイレクトして、その場所があれば、その現在の内容に追加します。 その場所が存在しない場合は、作成されます。

m>&n 形式のリダイレクト演算子は、ストリーム m からストリーム nと同じ場所に出力を書き込みます。

有効なストリームを次に示します。

説明
1 標準出力ストリーム
2 エラー出力ストリーム
3 警告出力ストリーム
4 詳細出力ストリーム
5 デバッグ出力ストリーム
* 標準出力、エラー出力、警告出力、詳細出力、デバッグ出力ストリーム

リダイレクト演算子 1>&26>6>>、および < は、将来使用するために予約されています。

出力時に、"リダイレクト ファイル名" の値が $null の場合、出力は破棄されます。

通常、最上位の副作用を含む式の値は、その式がかっこで囲まれていない限り、パイプラインに書き込まれません。 ただし、このような式が標準出力をリダイレクトする演算子の左オペランドである場合は、値が書き込まれます。

例:

$i = 200                       # pipeline gets nothing
$i                             # pipeline gets result
$i > output1.txt               # result redirected to named file
++$i >> output1.txt            # result appended to named file
type file1.txt 2> error1.txt   # error output redirected to named file
type file2.txt 2>> error1.txt  # error output appended to named file
dir -Verbose 4> verbose1.txt   # verbose output redirected to named file

# Send all output to output2.txt
dir -Verbose -Debug -WarningAction Continue *> output2.txt

# error output redirected to named file, verbose output redirected
# to the same location as error output
dir -Verbose 4>&2 2> error2.txt