about_Assignment_Operators
簡単な説明
演算子を使用して変数に値を割り当てる方法について説明します。
詳細な説明
代入演算子は、1 つ以上の値を変数に割り当てます。 等号 (=
) は PowerShell 割り当て演算子です。 PowerShell には、+=
、-=
、*=
、%=
、++
、--
、??=
のcompound代入演算子もあります。
複合代入演算子は、代入の前に値に対して操作を実行します。
構文
代入演算子の構文は次のとおりです。
<assignable-expression>
<assignment-operator>
<value>
代入可能な式には、変数とプロパティが含まれます。 値には、1 つの値、値の配列、またはコマンド、式、またはステートメントを指定できます。
インクリメント演算子とデクリメント演算子は単項演算子です。 それぞれにプレフィックスと後置バージョンがあります。
<assignable-expression><operator>
<operator><assignable-expression>
代入可能な式の値は数値であるか、数値に変換できる必要があります。
代入演算子の使用
変数は、値を格納する名前付きメモリ空間です。 代入演算子の =
を使用して、変数に値を格納します。 新しい値は、変数の既存の値を置き換えたり、既存の値に新しい値を追加したりすることもできます。 たとえば、次のステートメントでは、値 PowerShell を $MyShell
変数に割り当てます。
$MyShell = "PowerShell"
PowerShell で変数に値を割り当てると、変数がまだ存在していない場合は作成されます。 たとえば、次の 2 つの代入ステートメントの 1 つ目は、 $a
変数を作成し、値 6 を $a
に割り当てます。 2 番目の代入ステートメントでは、 $a
に値 12 が割り当てられます。 最初のステートメントでは、新しい変数が作成されます。 2 番目のステートメントは、その値のみを変更します。
$a = 6
$a = 12
PowerShell の変数には、キャストしない限り、特定のデータ型はありません。 変数に含まれるオブジェクトが 1 つだけの場合、その変数はそのオブジェクトのデータ型を受け取ります。 変数にオブジェクトのコレクションが含まれている場合、変数には System.Object データ型があります。 そのため、任意の種類のオブジェクトをコレクションに割り当てることができます。 次の例は、エラーを生成せずに、プロセス オブジェクト、サービス オブジェクト、文字列、および整数を変数に追加できることを示しています。
$a = Get-Process
$a += Get-Service
$a += "string"
$a += 12
代入演算子 =
はパイプライン演算子 |
よりも優先順位が低いため、コマンド パイプラインの結果を変数に割り当てるためにかっこは必要ありません。 たとえば、次のコマンドは、コンピューター上のサービスを並べ替え、並べ替えられたサービスを $a
変数に割り当てます。
$a = Get-Service | Sort-Object -Property name
次の例のように、ステートメントによって作成された値を変数に割り当てることもできます。
$a = if ($b -lt 0) { 0 } else { $b }
次の使用例は、$b
の値が 0 未満の場合、$a
変数に 0 を割り当てます。 $b
の値が 0 未満でない場合は、$b
の値が$a
に割り当てられます。
配列 (複数の値) を変数に割り当てるには、次のように値をコンマで区切ります。
$a = "apple", "orange", "lemon", "grape"
ハッシュ テーブルを変数に割り当てるには、PowerShell で標準のハッシュ テーブル表記を使用します。 アット マーク @
を入力し、その後にキーと値のペアをセミコロンで区切って ;
、中かっこで囲 { }
。 たとえば、 $a
変数にハッシュテーブルを割り当てるには、次のように入力します。
$a = @{one=1; two=2; three=3}
変数に 16 進数の値を割り当てるには、値の前に 0x
を付けます。
PowerShell は、16 進数の値 (0x10) を 10 進値 (この場合は 16) に変換し、その値を $a
変数に割り当てます。 たとえば、0x10の値を $a
変数に割り当てるには、次のように入力します。
$a = 0x10
指数値を変数に代入するには、ルート番号、文字 e
、10 の倍数を表す数値を入力します。 たとえば、値 3.1415 を 1,000 の累乗に $a
変数に割り当てるには、次のように入力します。
$a = 3.1415e3
PowerShell では、キロバイト KB
、メガバイト MB
、ギガバイト GB
をバイトに変換することもできます。 たとえば、 $a
変数に 10 KB の値を割り当てるには、次のように入力します。
$a = 10kb
複合代入演算子の使用
複合代入演算子は、代入前の値に対して数値演算を実行します。
重要
複合代入演算子では、動的スコープは使用されません。 変数は常に現在のスコープ内にあります。
次の例では、 $x
変数がグローバル スコープで定義されています。 中かっこによって新しいスコープが作成されます。 中かっこ内 $x
変数は新しいインスタンスであり、グローバル変数のコピーではありません。
$x = 1 # Global scope
& { $x += 1; $x }
1
通常の代入演算子を使用すると、親スコープから変数のコピーが取得されます。 ただし、親スコープ内の $x
は変更されないことに注意してください。
$x = 1 # Global scope
& { $x = $x + 1; $x }
"Global `$x = $x"
2
Global $x = 1
加算演算子による代入
加算演算子による代入 +=
は、変数の値をインクリメントするか、指定した値を既存の値に追加します。 このアクションは、変数に数値型または文字列型があるかどうか、および変数に 1 つの値 (スカラー) または複数の値 (コレクション) が含まれているかどうかによって異なります。
+=
演算子は、2 つの操作を結合します。 最初に追加し、次に割り当てます。
したがって、次のステートメントは同等です。
$a += 2
$a = ($a + 2)
変数に 1 つの数値が含まれている場合、 +=
演算子は、演算子の右側にある量だけ既存の値をインクリメントします。 次に、演算子は結果の値を変数に割り当てます。 次の例は、 +=
演算子を使用して変数の値を増やす方法を示しています。
$a = 4
$a += 2
$a
6
変数の値が文字列の場合、次のように演算子の右側の値が文字列に追加されます。
$a = "Windows"
$a += " PowerShell"
$a
Windows PowerShell
変数の値が配列の場合、 +=
演算子は演算子の右側の値を配列に追加します。 キャストによって配列が明示的に型指定されていない限り、次のように任意の型の値を配列に追加できます。
$a = 1,2,3
$a += 2
$a
1
2
3
2
and
$a += "String"
$a
1
2
3
2
String
変数の値がハッシュ テーブルの場合、 +=
演算子は、演算子の右側の値をハッシュ テーブルに追加します。 ただし、ハッシュ テーブルに追加できる型は別のハッシュ テーブルのみであるため、他のすべての割り当ては失敗します。
たとえば、次のコマンドは、 $a
変数にハッシュ テーブルを割り当てます。
次に、 +=
演算子を使用して、既存のハッシュ テーブルに別のハッシュ テーブルを追加し、既存のハッシュ テーブルに新しいキーと値のペアを効果的に追加します。
出力に示すように、このコマンドは成功します。
$a = @{a = 1; b = 2; c = 3}
$a += @{mode = "write"}
$a
Name Value
---- -----
a 1
b 2
mode write
c 3
次のコマンドは、 $a
変数のハッシュ テーブルに整数 "1" を追加しようとします。 このコマンドは失敗します。
$a = @{a = 1; b = 2; c = 3}
$a += 1
InvalidOperation:
Line |
2 | $a += 1
| ~~~~~~~
| A hash table can only be added to another hash table.
減算演算子による代入
減算演算子による代入 -=
、演算子の右側で指定された値によって変数の値をデクリメントします。 この演算子は文字列変数では使用できません。また、コレクションから要素を削除するために使用することもできません。
-=
演算子は、2 つの操作を結合します。 最初に減算し、次に割り当てます。 したがって、次のステートメントは同等です。
$a -= 2
$a = ($a - 2)
次の例は、 -=
演算子を使用して変数の値を小さくする方法を示しています。
$a = 8
$a -= 2
$a
6
-=
代入演算子を使用して、数値配列のメンバーの値を減らすこともできます。 これを行うには、変更する配列要素のインデックスを指定します。 次の例では、配列の 3 番目の要素 (要素 2) の値が 1 減少しています。
$a = 1,2,3
$a[2] -= 1
$a
1
2
2
-=
演算子を使用して変数の値を削除することはできません。 変数に割り当てられているすべての値を削除するには、 Clear-Item または Clear-Variable コマンドレットを使用して、 $null
または ""
の値を変数に割り当てます。
$a = $null
配列から特定の値を削除するには、配列表記を使用して、 $null
の値を特定の項目に割り当てます。 たとえば、次のステートメントは、配列から 2 番目の値 (インデックス位置 1) を削除します。
$a = 1,2,3
$a
1
2
3
$a[1] = $null
$a
1
3
変数を削除するには、 Remove-Variable コマンドレットを使用します。 このメソッドは、変数が特定のデータ型に明示的にキャストされていて、型指定されていない変数が必要な場合に便利です。 次のコマンドは、 $a
変数を削除します。
Remove-Variable -Name a
乗算演算子による代入
乗算演算子による代入 *=
数値を乗算するか、変数の文字列値の指定されたコピー数を追加します。
変数に 1 つの数値が含まれている場合、その値に演算子の右側の値が乗算されます。 たとえば、次の例は、 *=
演算子を使用して変数の値を乗算する方法を示しています。
$a = 3
$a *= 4
$a
12
この場合、 *=
演算子は 2 つの操作を結合します。 最初に乗算し、次に割り当てます。 したがって、次のステートメントは同等です。
$a *= 2
$a = ($a * 2)
変数に文字列値が含まれている場合、PowerShell は次のように、指定した数の文字列を値に追加します。
$a = "file"
$a *= 4
$a
filefilefilefile
配列の要素を乗算するには、インデックスを使用して、乗算する要素を識別します。 たとえば、次のコマンドでは、配列の最初の要素 (インデックス位置 0) に 2 を乗算します。
$a[0] *= 2
除算演算子による代入
除算演算子による代入 /=
は、数値を演算子の右側に指定された値で除算します。 演算子を文字列変数と共に使用することはできません。
/=
演算子は、2 つの操作を結合します。 最初に分割し、次に割り当てます。 したがって、次の 2 つのステートメントは同等です。
$a /= 2
$a = ($a / 2)
たとえば、次のコマンドでは、 /=
演算子を使用して変数の値を除算します。
$a = 8
$a /=2
$a
4
配列の要素を分割するには、インデックスを使用して、変更する要素を識別します。 たとえば、次のコマンドは、配列内の 2 番目の要素 (インデックス位置 1) を 2 で除算します。
$a[1] /= 2
剰余演算子による代入
剰余演算子による代入 %=
変数の値を演算子の右側の値で除算します。 次に、 %=
演算子は剰余 (剰余) を変数に割り当てます。 この演算子は、変数に 1 つの数値が含まれている場合にのみ使用できます。 変数に文字列変数または配列が含まれている場合は、この演算子を使用できません。
%=
演算子は、2 つの操作を結合します。 最初に、剰余を除算して決定し、次に剰余を変数に割り当てます。 したがって、次のステートメントは同等です。
$a %= 2
$a = ($a % 2)
次の例は、 %=
演算子を使用して商の剰余を保存する方法を示しています。
$a = 7
$a %= 4
$a
3
インクリメント演算子とデクリメント演算子
インクリメント演算子 ++
変数の値を 1 ずつ増やします。 単純なステートメントでインクリメント演算子を使用する場合、値は返されません。 結果を表示するには、次のように変数の値を表示します。
$a = 7
++$a
$a
8
値を強制的に返すには、次のように変数と演算子をかっこで囲みます。
$a = 7
(++$a)
8
インクリメント演算子は、変数の前 (プレフィックス) または後 (後置) に配置できます。 演算子のプレフィックス バージョンは、次のように、ステートメントで値が使用される前に変数をインクリメントします。
$a = 7
$c = ++$a
$a
8
$c
8
後置バージョンの演算子は、ステートメントで値が使用された後に変数をインクリメントします。 次の例では、$c
変数と$a
変数の値が異なります。これは、$a
変更する前に値が $c
に割り当てられるためです。
$a = 7
$c = $a++
$a
8
$c
7
デクリメント演算子 --
変数の値を 1 ずつ小さくします。 インクリメント演算子と同様に、単純なステートメントで演算子を使用しても値は返されません。 次のように、かっこを使用して値を返します。
$a = 7
--$a
$a
6
(--$a)
5
演算子のプレフィックス バージョンは、次のように、ステートメントで値が使用される前に変数をデクリメントします。
$a = 7
$c = --$a
$a
6
$c
6
後置バージョンの演算子は、ステートメントで値が使用された後に変数をデクリメントします。 次の例では、$d
変数と$a
変数の値が異なります。これは、$a
変更する前に値が $d
に割り当てられるためです。
$a = 7
$d = $a--
$a
6
$d
7
Null 合体代入演算子
null 合体代入演算子 ??=
は、左側のオペランドが null と評価された場合にのみ、右側のオペランドの値を左側のオペランドに代入します。 ??=
演算子では、左側のオペランドが null 値以外に評価された場合は、その右側のオペランドは評価されません。
$x = $null
$x ??= 100
$x
100
詳細については、 Null-coalescing 演算子を参照してください。
Microsoft .NET 型
既定では、変数に値が 1 つしかない場合、変数に割り当てられる値によって変数のデータ型が決まります。 たとえば、次のコマンドは、 System.Int32 型の変数を作成します。
$a = 6
変数の .NET 型を検索するには、 GetType メソッドとその FullName プロパティを使用します。 メソッド呼び出しに引数がない場合でも、 GetType メソッド名の後にかっこを含めるようにしてください。
$a = 6
$a.GetType().FullName
System.Int32
文字列を含む変数を作成するには、変数に文字列値を割り当てます。 値が文字列であることを示すには、次のように引用符で囲みます。
$a = "6"
$a.GetType().FullName
System.String
変数に割り当てられる最初の値が文字列の場合、PowerShell はすべての操作を文字列操作として扱い、新しい値を文字列にキャストします。 これは、次の例で発生します。
$a = "file"
$a += 3
$a
file3
最初の値が整数の場合、PowerShell はすべての操作を整数操作として扱い、新しい値を整数にキャストします。 これは、次の例で発生します。
$a = 6
$a += "3"
$a
9
新しい scalar 変数を任意の .NET 型としてキャストするには、変数名または最初の代入値の前に型名を角かっこで囲みます。 変数をキャストするときは、変数に格納できるデータの型を定義します。
たとえば、次のコマンドは、変数を文字列型としてキャストします。
[string]$a = 27
$a += 3
$a
273
次の例では、変数をキャストするのではなく、最初の値をキャストします。
$a = [string]27
値を新しいデータ型に変換できない場合、既存の変数のデータ型を再キャストすることはできません。
$a = "string"
[int]$a
InvalidArgument: Cannot convert value "string" to type "System.Int32". Error:
"The input string 'string' was not in a correct format."
データ型を変更するには、次のように値を置き換える必要があります。
[int]$a = 3
さらに、変数名の前にデータ型がある場合、別のデータ型を指定して型を明示的にオーバーライドしない限り、その変数の型はロックされます。 既存の型と互換性のない値を割り当てようとしても、型を明示的にオーバーライドしない場合、次の例に示すように、PowerShell によってエラーが表示されます。
$a = 3
$a = "string"
[int]$a = 3
$a = "string"
MetadataError:
Line |
2 | $a = "string"
| ~~~~~~~~~~~~~
| Cannot convert value "string" to type "System.Int32". Error: "The input
string 'string' was not in a correct format."
[string]$a = "string"
PowerShell では、配列内に複数の項目を含む変数のデータ型は、1 つの項目を含む変数のデータ型とは異なる方法で処理されます。 データ型が配列変数に明示的に割り当てられている場合を除き、データ型は常に System.Object []
されます。 このデータ型は配列に固有です。
場合によっては、別の型を指定することで、既定の型をオーバーライドできます。 たとえば、次のコマンドは変数を string []
配列型としてキャストします。
[string []] $a = "one", "two", "three"
PowerShell 変数には、任意の .NET データ型を指定できます。 さらに、現在のプロセスで使用できる完全修飾 .NET データ型を割り当てることができます。 たとえば、次のコマンドは System.DateTime
データ型を指定します。
[System.DateTime]$a = "5/31/2005"
変数には、 System.DateTime
データ型に準拠する値が割り当てられます。 $a
変数の値は次のようになります。
Tuesday, May 31, 2005 12:00:00 AM
複数の変数の割り当て
PowerShell では、1 つのコマンドを使用して複数の変数に値を割り当てることができます。 代入値の最初の要素は最初の変数に割り当てられ、2 番目の要素は 2 番目の変数に割り当てられ、3 番目の要素は 3 番目の変数に割り当てられます。 これは、"複数の代入" と呼ばれます。
たとえば、次のコマンドでは、 $a
変数に値 1、 $b
変数に値 2、 $c
変数に値 3 を割り当てます。
$a, $b, $c = 1, 2, 3
代入値に変数よりも多くの要素が含まれている場合、残りの値はすべて最後の変数に割り当てられます。 たとえば、次のコマンドには、3 つの変数と 5 つの値が含まれています。
$a, $b, $c = 1, 2, 3, 4, 5
そのため、PowerShell は値 1 を $a
変数に、値 2 を $b
変数に割り当てます。 $c
変数に値 3、4、5 が割り当てられます。
$c
変数の値を他の 3 つの変数に割り当てるには、次の形式を使用します。
$d, $e, $f = $c
このコマンドは、 $d
変数に値 3、 $e
変数に値 4、 $f
変数に値 5 を割り当てます。
代入値に含まれる要素数が変数よりも少ない場合、残りの変数には $null
値が割り当てられます。 たとえば、次のコマンドには、3 つの変数と 2 つの値が含まれています。
$a, $b, $c = 1, 2
そのため、PowerShell は値 1 を $a
変数に、値 2 を $b
変数に割り当てます。 $c
変数は$null
。
また、変数を連結することで、1 つの値を複数の変数に割り当てることもできます。 たとえば、次のコマンドは、4 つの変数すべてに値 "3" を割り当てます。
$a = $b = $c = $d = "three"
変数関連のコマンドレット
代入操作を使用して変数値を設定するだけでなく、 Set-Variable コマンドレットを使用することもできます。 たとえば、次のコマンドでは、 Set-Variable
を使用して、 $a
変数に 1、2、3 の配列を割り当てます。
Set-Variable -Name a -Value 1, 2, 3
関連項目
PowerShell