7. 式

構文:

expression:
    logical-expression

説明:

は、メソッド、関数、書き込み可能な場所、または値を指定する演算子とオペランドのシーケンスです。式は、値の計算を指定するか、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) を指定する式は、その式の値が使用されるときに、その構成要素に列挙されます。 ただし、式がコマンドレットの呼び出しである場合、これは当てはまりません。 たとえば、次のように入力します。

$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 番目のケースの式はコマンドレットを直接呼び出すため、結果は列挙されず、$a は 2 つの要素、int[3]int の配列です。

操作が 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 and ($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: Note no whitespace is allowed after primary-expression. 
    primary-expression . member-name
    primary-expression :: member-name

説明:

演算子 . は、オブジェクトからインスタンス メンバーを選択するか、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: Note no whitespace is allowed after primary-expression. 
    primary-expression . member-name argument-list
    primary-expression :: member-name argument-list

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

説明:

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

この演算子は左結合です。

呼び出し式 の結果の型は、メソッド指定子 (§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: Note no whitespace is allowed between primary-expression and [.
    primary-expression [ new-lines~opt~ expression new-lines~opt~ ]

説明:

一次式 と左角かっこ ([) の間に空白を入れることはできません。

7.1.4.1 配列の添字

説明:

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

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

一次式 で 2 次元配列 B を指定する場合、演算子 [] は、(コンマ区切りリストとして指定された) および コンポーネントの値が int に変換された後に B[0 + row,0 + column] にある要素を返します。 結果の型は、添字を付けられた配列の要素型になります。 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 ハッシュテーブルの添字

説明:

一次式 でハッシュテーブルを指定する場合、演算子 [] は、 で指定されたキーに関連付けられた値を返します。 の型は制限されません。

が単一のキー名である場合、キーが存在しない場合を除いて、結果は関連付けられた値になり、型はその型になります。キーが存在しない場合、結果は $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

が単一のキー名である場合、ハッシュテーブルの添字の唯一の値として $null を使用すると、NullArrayIndex 例外が発生します。

7.1.4.4 XML ドキュメントの添字

説明:

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

例 :

$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) またはハッシュテーブルであるオブジェクトを指定し、 が 1 次元配列である場合、結果は、 の要素で指定された 一次式 の要素を含む配列スライス (§9.9) になります。

ハッシュテーブルの場合、配列スライスには、このようなキーが存在しない場合を除いて、指定されたキーに関連付けられた値が含まれます。キーが存在しない場合、対応する要素は $null になります。 $null をキー名として使用する場合、動作は実装定義になります。

例 :

$a = [int[]](30,40,50,60,70,80,90)
$a[1,3,5]                 # slice has Length 3, value 40,60,80
++$a[1,3,5][1]            # preincrement 60 in array 40,60,80
$a[,5]                    # slice with Length 1
$a[@()]                   # slice with Length 0
$a[-1..-3]                # slice with Length 0, 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 1 (123)

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

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

構文:

post-increment-expression:
    primary-expression ++

post-decrement-expression:
    primary-expression dashdash

dashdash:
    --

説明:

一次式 では、数値型 (§4) の値または値 $null を含む書き込み可能な場所を指定します。 オペランドで指定された値が $null の場合、演算子が評価される前に、その値は、int 型の値 0 に変換されます。 一次式 で指定された値の型は、結果が格納される際に変更される可能性があります。 代入による型の変更については、§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 bahavior

$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 次元配列です。

例 :

$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) です。

パラメーター ブロック を省略した場合、スクリプト ブロックに渡される引数は、$args (§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

説明:

ハッシュ リテラル式 は、それぞれがキーと値のペアである要素が 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 }

それぞれに 3 つのキーと値のペアが含まれている 2 つのハッシュテーブル $h1 および $h2 を作成し、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][object[][int[,,]] があります。 文字列の保持に特化されたジェネリック スタック型 (§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

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

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

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

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

説明:

演算子 -not は、"単項式" で指定された値を必要に応じてブール型に変換し (§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

説明:

演算子 -bnot は、"単項式" で指定された値を必要に応じて整数型に変換します (§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 単項プラス

説明:

+"単項式" 形式の式は、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 単項マイナス

説明:

-"単項式" 形式の式は、0 - unary-expression (§7.7) として記述された場合と同様に処理されます。 整数リテラル 0 の型は、int です。

この演算子は右結合です。

例 :

-$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 を参照してください。

プレフィックス ++ 演算子の場合、"単項式" の値は、適切な型になり、1 ずつ増分されます。 結果は、増分が行われた後の新しい値になります。 式 ++EE += 1 と等価です (§7.11.2)。

プレフィックス -- 演算子の場合、"単項式" の値は、適切な型になり、1 ずつ減分されます。 結果は、減分が行われた後の新しい値になります。 式 --EE -= 1 と等価です (§7.11.2)。

これらの演算子は右結合です。

例 :

$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->-1

7.2.7 単項 -join 演算子

説明:

単項 -join 演算子は、"単項式" で指定された 1 つ以上のオブジェクトの値を連結した文字列を生成します (この演算子の 2 項バージョン (§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 演算子は、"単項式" で指定された 1 つ以上の文字列を分割して、そのサブパートを、文字列の制約付き 1 次元配列で返します。 空白文字の連続するグループは、連続するサブパート間の区切り記号として処理されます (この演算子の 2 項バージョン (§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)。 "型リテラル" が 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 2 項コンマ演算子

構文:

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

説明:

2 項コンマ演算子は、オペランドで指定された値を要素とする 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

特定の 2 項コンマ式にグループ化かっこを追加しても、規定の優先順位は示されません。代わりに、結果が変更されます。

7.4 範囲演算子

構文:

range-expression:
array-literal-expression
range-expression *..* new-lines~opt~
array-literal-expression

説明:

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

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

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

例 :

1..10        # ascending range 1..10
-500..-495   # descending range -500..-495
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:
    range-expression
    format-expression 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 Technical Report TR/84 の System.IFormattable 型を参照してください。

例 :

`$i` = 10; $j = 12
"{2} <= {0} + {1}\`n" -f $i,$j,($i+$j)  # 22 <= 10 + 12
">{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 % <
$format = ">{0:x8}<"
$format -f 123455                       # >0001e23f<

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

7.6 乗法演算子

構文:

multiplicative-expression:
    format-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 文字列のレプリケーション

説明:

左側のオペランドで文字列を指定する場合、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 配列のレプリケーション

説明:

左側のオペランドで配列を指定する場合、2 項 * 演算子は、左側のオペランドで指定された値を、整数型に変換された (§6.4) 右側のオペランドの値で指定された回数だけレプリケートした制限のない新しい 1 次元配列を作成します。 レプリケート回数が 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) が適用された後、左側のオペランドで指定された値を右側のオペランドで指定された値で除算した場合の商です。

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

この演算子は左結合です。

例 :

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

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

7.6.5 剰余

説明:

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

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

例 :

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

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

7.7 加法演算子

構文:

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

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 文字列連結

説明:

左側のオペランドで文字列を指定する場合、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 配列連結

説明:

左側のオペランドで配列を指定する場合、2 項 + 演算子は、左側のオペランドで指定された要素と、その直後に、右側のオペランドで指定された値を含む制約のない新しい 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 ハッシュテーブル連結

説明:

両方のオペランドでハッシュテーブルを指定する場合、2 項 + 演算子は、左側のオペランドで指定された要素と、その直後に、右側のオペランドで指定された要素を含む新しいハッシュテーブルを作成します。

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

この演算子は左結合です。

例 :

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

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

7.7.5 減算

説明:

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

この演算子は左結合です。

例 :

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

7.8 比較演算子

構文:

comparison-operator: one of
    dash as           dash ccontains     dash ceq
    dash cge          dash cgt           dash cle
    dash clike        dash clt           dash cmatch
    dash cne          dash cnotcontains  dash cnotlike
    dash cnotmatch    dash contains      dash creplace
    dash csplit       dash eq            dash ge
    dash gt           dash icontains     dash ieq
    dash ige          dash igt           dash ile
    dash ilike        dash ilt           dash imatch
    dash in           dash ine           dash inotcontains
    dash inotlike     dash inotmatch     dash ireplace
    dash is           dash isnot         dash isplit
    dash join         dash le            dash like
    dash lt           dash match         dash ne
    dash notcontains  dash notin         dash notlike
    dash notmatch     dash replace       dash shl
    dash shr          dash split

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

説明:

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

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

これらの演算子は左結合です。

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

説明:

"等値演算子" には、等値 (-eq) と非等値 (-ne) の 2 つがあり、"関係演算子" には、より小さい (-lt)、以下 (-le)、より大きい (-gt)、以上 (-ge) の 4 つがあります。 これらのそれぞれに、2 つのバリアントがあります (§7.8)。

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

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

例 :

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 包含演算子

説明:

"包含演算子" には、含む (-contains)、含まない (‑notcontains)、内 (-in)、外 (-notin) の 4 つがあります。 これらのそれぞれに、2 つのバリアントがあります (§7.8)。

包含演算子は、配列の要素内で値が少なくとも 1 回発生するかどうか (または発生しないかどうか) を示す bool 型の結果を返します。 -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
"010",20,30 -contains 10        # False
10,20,30,20,10 -notcontains 15  # True
"Red",20,30 -ccontains "RED"    # False

7.8.3 型テスト演算子と変換演算子

説明:

型演算子 -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 演算子

説明:

左側のオペランドでコレクションを指定しない場合、結果の型は bool になります。 それ以外の場合、結果は、場合によっては空の制約のない 1 次元配列になります。これには、右側のオペランドで指定された値と比較して True かどうかをテストするコレクションの要素が含まれます。 右側のオペランドでは、ワイルドカード式 (§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 演算子

説明:

左側のオペランドでコレクションを指定しない場合、結果には bool 型が含まれ、その結果が $true の場合、ハッシュテーブル $matches の要素は、右側のオペランドで指定された値と一致する (または一致しない) 文字列に設定されます。 それ以外の場合、結果は、場合によっては空の制約のない 1 次元配列になります。これには、右側のオペランドで指定された値と比較して True かどうかをテストするコレクションの要素が含まれます。$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 演算子

説明:

-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 2 項 -join 演算子

説明:

2 項 -join 演算子は、左側のオペランドで指定された 1 つ以上のオブジェクトの値を必要に応じて文字列に変換 (§6.7) した後、それらを連結した文字列を生成します。 右側のオペランドで指定された文字列は、結果として生成された文字列内の (場合によっては空の) 値を分離するために使用されます。

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

例 :

(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 2 項 -split 演算子

説明:

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

  • "区切り文字"
  • 区切り文字と、その後に数値の "分割カウント" を含む 2 つのオブジェクトの配列
  • 区切り文字、数値の分割カウント、"オプション文字列" を含む 3 つのオブジェクトの配列
  • スクリプト ブロック
  • スクリプト ブロックと、その後に数値の分割カウントを含む 2 つのオブジェクトの配列

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

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

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

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

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

オプション 説明
CultureInvariant 区切り記号を評価する際に、言語の文化的な違いを無視します。
ExplicitCapture 名前が付けられていない一致グループを無視して、明示的なキャプチャ グループのみを結果リストに返します。
IgnoreCase -csplit が使用される場合でも、大文字と小文字を区別しない照合を強制します。
IgnorePatternWhitespace エスケープされていない空白と番号記号 (#) でマークされたコメントを無視します。
Multiline このモードでは、行と文字列の開始と終了が認識されます。 既定のモードは、Singleline です。
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)"

このパターンを使用すると、"r"、"re"、"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'

結果として生成される文字列は、"the morning of Monday" です。

$matches のキーを 0 から始まるインデックスにする代わりに、?<*name*> の形式を使用して部分一致に名前を付けることができます。 たとえば、"((r)e)(d)" は、3 つの名前付き部分一致 (m1、m2、m3) を使用して、"(?<m1>(?<m2>r)e)(?<m3>d)"と記述できます。

7.8.5 シフト演算子

説明:

左シフト (-shl) 演算子および右シフト (-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:
    comparison-expression
    bitwise-expression -band new-lines~opt~ comparison-expression
    bitwise-expression -bor new-lines~opt~ comparison-expression
    bitwise-expression -bxor new-lines~opt~ comparison-expression

説明:

ビットごとの AND 演算子 -band、ビットごとの OR 演算子 -bor、ビットごとの XOR 演算子 -bxor は、必要に応じて、通常の算術変換 (§6.15) を使用して、オペランドで指定された値を整数型に変換します。 変換後、両方の値に int 型が含まれている場合、それが結果の型になります。 それ以外の場合、両方の値に long 型が含まれていれば、それが結果の型になります。 一方の値に 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:
    bitwise-expression
    logical-expression -and new-lines~opt~ bitwise-expression
    logical-expression -or new-lines~opt~ bitwise-expression
    logical-expression -xor new-lines~opt~ bitwise-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 単純な代入

説明:

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

文法で示すように、"式" では、書き込み可能な場所のコンマ区切りリストを指定できます。 これは、"複数の代入" と呼ばれます。 "ステートメント" では、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:
    assignment-expression
    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

説明:

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

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

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