1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellでの追加を解説

2022-01-05 20:58:14

PowerShellの演算子については、すでにある程度ご理解いただけたと思います。PowerShellでは、数値型、文字列型、配列型、ハッシュテーブル型に対して、"+"演算子の固有の動作が定義されています。数値計算を行う場合、"+"は、基本的に通常の数値計算のルールと同じです。ただし、コンピュータ内部で異なる数値型を表現する際に使用する記憶領域が異なるため、これらの型はそれぞれデータの範囲しか表現できないことに注意してください。数値演算の過程で、計算結果が参加する数値型の値域を超える場合、PowerShellは自動的に型変換を行い、より大きな値域を持つデータ型を使って結果を保存します。例えば、以下のような感じです。

PS C:\> 9 + 11
20
PS C:\> (9 + 11).GetType().FullName
System.Int32
PS C:\> [int]::MaxValue + 1
2147483648
PS C:\> ([int]::MaxValue + 1).GetType().FullName
System.Double
PS C:\> [int]::MinValue - 1
-2147483649
PS C:\> ([int]::MinValue - 1).GetType().FullName
System.Double


この例の [int]::MaxValue は、int 型の最大値を表します。このまま "+ 1" を実行すると、int 型の値域を超えてしまうため、PowerShell は自動的に Double 型に変換しています。同様に、[int]::MinValueは、int型の最小値を表します。

文字列型のオペランドに "+" 演算子を使用すると、PowerShell は文字列を連結して新しい文字列を返しますが、これは C# 言語と SQL Server データベースの T-SQL 構文で一貫した操作です。たとえば、以下のようになります。

PS C:\> "Hello" + " " + "world!"
Hello world!


配列型のオペランドに"+"演算子を使用すると、配列の連結操作が行われ、新しい配列を返します。これは、C#での動作と一致しています。たとえば、以下のようになります。

PS C:\> $array1 = 1,2,3
PS C:\> $array2 = 4,5
PS C:\> $array3 = $array1 + $array2
PS C:\> "$array3"
1 2 3 4 5


この例では、まず配列1が定義され、その中には1、2、3の要素が含まれています。次に、配列array1に配列array2を加え、その結果を変数array3に格納します。最後に、配列の要素がコンソールに出力されます。PowerShellでは、配列をダブルクォートで参照すると、配列の各要素は変数$ofsに格納されている文字列で相互に連結されて出力されます。("$ofs"のデフォルト値は、スペース文字です)。

ハッシュテーブル型のオペランドに "+" 演算子を使用すると、PowerShell は "+" の右側にあるハッシュテーブルのキーと値のペアをハッシュテーブルの左側に追加します。追加されたキー値がすでに左のハッシュテーブルに存在する場合、PowerShellはエラーを出します。例

PS C:\> $dev = @{ Tom = 1; Jerry = 2}
PS C:\> $sale = @{ Hero = 1; }
PS C:\> $dev + $sale
Name Value
---- -----
Tom 1
Jerry 2
Hero 1


この例では、まずR&D部門の社員TomとJerryを含むハッシュテーブルdevを定義し、次に社員Heroを1人含むハッシュテーブルsaleを定義しています。これら3人の従業員を含む新しいハッシュテーブルは、devとsaleを合計することで得られます。右のハッシュテーブルに左のハッシュテーブルと同じキー-バリューペアが含まれている場合、PowerShellは次のエラーメッセージを表示します。

PS C:\> $manager = @{ Tom = 3 }
PS C:\> $dev + $manager
Bad argument to operator '+': added item. Dictionary keyword: "Tom" added keyword: "Tom".
At line:1 char:7
+ $dev + <<<< $manager


これまでの例では、同じ型のオブジェクトを足し合わせています。もし、"+"の両側にあるオブジェクトが同じタイプでなかった場合、実際にどのような結果になるのか気になるかもしれません。ここでは、よくあるシナリオをいくつか紹介します。

PS C:\> 123 + '23'
146
PS C:\> 123 + '0xa'
133
PS C:\> 4 + 'test'
Cannot convert value "test" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:4
+ 4 + <<<< 'test'
PS C:\> '02' + 73
0273


PowerShell は "+" 演算子を見つけると、左のオペランドの型に基づいて計算のルールを決定します。最初の式 123 + '23' では、123 は整数なので、"+" は数値の加算演算を行います。しかし、右のオペランドは文字列型なので、PowerShellはまずそのオペランドに対して型変換を行います。そのため、最終的には、結果は数値型の値として表示されます。146. 2番目の例では、文字列に16進数の整数が含まれており、PowerShellはその値を正しく数値型に変換して計算を実行します。3番目の例では、文字列「test」は整数型に変換できないため、PowerShellはエラーメッセージ「"The input string is not in the correct format"」を出力しています。4 番目の例では、左オペランドが数値を含む文字列になっているので、PowerShell は文字列の連結処理を行います。