トピック about_Arithmetic_Operators 簡易説明 Windows PowerShell で算術演算を実行する演算子について説明します。 詳細説明 算術演算子は数値の計算に使用します。1 つまたは複数の算術演算子を使用して、値の加算、減算、乗 算、および除算を実行し、さらに除算の余り (法) を計算することができます。 また、加算演算子 (+) と乗算演算子 (*) は文字列、配列、およびハッシュ テーブルにも使用できます。加 算演算子は、入力を連結します。乗算演算子は、入力の複数コピーを返します。1 つの算術ステートメント に異なる複数のオブジェクト型を混在させることもできます。 ステートメントの評価に使用されるメソッドは、式内の一番左にあるオブジェクトの型によって決まります。 Windows PowerShell は、次の算術演算子をサポートしています。 演算子 説明 例 -------- ----------- ------- + 整数を加算します。文字列、配列、 6+2 およびハッシュ テーブルを連結します。 "file" + "name" - 一方の値から他方の値を減算します。 6-2 (get-date).date - 1 - 数値を負の数にします。 -6+2 -4 * 整数を乗算します。文字列と配列を、 6*2 指定された回数だけコピーします。 "w" * 3 / 2 つの値で除算を行います。 6/2 % 除算の余りを返します。 7%2 演算子の優先順位 Windows PowerShell では、算術演算子が次の順序で処理されます。 かっこ () - (負の数を表すマイナス記号) *、\、% +、- (減算を表すマイナス記号) 式は、優先順位の規則に従って、左から右の方向に処理されます。次の例は、優先順位の規則による結果を示しています。 C:\PS> 3+6/3*4 11 C:\PS> 10+4/2 12 C:\PS> (10+4)/2 7 C:\PS> (3+3)/ (1+1) 3 Windows PowerShell が式を評価する順序は、他のプログラミング言語やスクリプト言語と異なる場合があ ります。次の例は、複雑な代入ステートメントを示しています。 C:\PS> $a = 0 C:\PS> $b = 1,2 C:\PS> $c = -1,-2 C:\PS> $b[$a] = $c[$a++] C:\PS> $b 1 -1 この例では、式 $a++ が $c[$a++] の前に評価されます。$a++ の評価によって、$a の値が変わります。 $b[$a] の変数 $a は 0 ではなく 1 であるため、このステートメントでは $b[0] ではなく $b[1] に値が代入 されます。 数値以外の型の加算と乗算 加算は、数値、文字列、配列、およびハッシュ テーブルを対象に行うことができます。乗算は、数値、文 字列、および配列を対象に行うことができます。ハッシュ テーブルを対象にした乗算はできません。 文字列、配列、またはハッシュ テーブルを加算すると、要素が連結されます。配列やハッシュ テーブル などのコレクションを連結すると、両方のコレクションに含まれていたオブジェクトから成る新しいオブジ ェクトが作成されます。同じキーを持つハッシュ テーブルを連結しようとすると、操作が失敗します。 たとえば、次のコマンドでは 2 つの配列が作成され、これらが加算されます。 C:\PS> $a = 1,2,3 C:\PS> $b = "A","B,"C" C:\PS> $a + $b 1 2 3 A B C 算術演算は、型が異なる複数のオブジェクトに対して行うこともできます。Windows PowerShell で実行さ れる演算は、演算内で一番左にあるオブジェクトの Microsoft .NET Framework 型によって決まります。 Windows PowerShell は、演算に含まれるすべてのオブジェクトを、先頭のオブジェクトの Microsoft .NET Framework 型に変換しようとします。 オブジェクトの変換が成功したら、先頭のオブジェクトの Microsoft .NET Framework 型に適した演算が実 行されます。いずれかのオブジェクトの変換が失敗した場合、演算が失敗します。 次の例は、さまざまなオブジェクト型を含む演算において加算演算子と乗算演算子を使用する例を示しています。 C:\PS> "file" + 16 file16 C:\PS> $array = 1,2,3 C:\PS> $array + 16 1 2 3 16 C:\PS> $array + "file" 1 2 3 file C:\PS> "file" * 3 filefilefile ステートメントの評価に使用されるメソッドは一番左のオブジェクトによって決まるため、Windows PowerShell での加算と乗算は厳密には可換ではありません。たとえば、(a + b) と (b + a) や、(a * b) と (b * a) は、それぞれ必ずしも等しいわけではありません。 次の例は、この原則を示しています。 C:\PS> "file" + 2 file2 C:\PS> 2 + "file" 値 "file" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。" 行:1 文字:4 + 2 + <<<< "file" C:\PS> "file" * 3 filefilefile C:\PS> 3 * "file" 値 "file" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。" 行:1 文字:4 + 3 * <<<< "file" ハッシュ テーブルの場合は若干異なります。ハッシュ テーブルは別のハッシュ テーブルに加算できま す。ハッシュ テーブルを配列に加算することもできます。ただし、その他の型をハッシュ テーブルに加算 することはできません。 次の例はそれぞれ、ハッシュ テーブルどうしを加算する方法と、ハッシュ テーブルを他のオブジェクト に加算する方法を示しています。 C:\PS> $hash1 = @{a=1; b=2; c=3} C:\PS> $hash2 = @{c1="Server01"; c2="Server02"} C:\PS> $hash1 + $hash2 Name Value ---- ----- c2 Server02 a 1 b 2 c1 Server01 c 3 C:\PS> $hash1 + 2 別のハッシュ テーブルは、ハッシュ テーブルにのみ追加できます。 行:1 文字:9 + $hash1 + <<<< 2 C:\PS> 2 + $hash1 "System.Collections.Hashtable" を "System.Int32" に変換できません。 行:1 文字:4 + 2 + <<<< $hash1 次の例は、ハッシュ テーブルを配列に加算できることを示しています。ハッシュ テーブル全体が、単一 のオブジェクトとして配列に加算されます。 C:\PS> $array = 1,2,3 C:\PS> $array + $hash1 1 2 3 Name Value ---- ----- a 1 b 2 c 3 C:\PS> $sum = $array + $hash1 C:\PS> $sum.count 4 C:\PS> $sum[3] Name Value ---- ----- a 1 b 2 c 3 PS C:\ps-test> $sum + $hash2 1 2 3 Name Value ---- ----- a 1 b 2 c 3 c2 Server02 次の例は、同じキーを含むハッシュ テーブルは加算できないことを示しています。 C:\PS> $hash1 = @{a=1; b=2; c=3} C:\PS> $hash2 = @{c="red"} C:\PS> $hash1 + $hash2 演算子 '+' の引数が正しくありません。項目は既に追加されています。 辞書のキー: 'c' 追加されるキー: 'c' 行:1 文字:9 + $hash1 + <<<< $hash2 加算演算子は非常に有用ですが、要素をハッシュ テーブルや配列に追加するには代入演算子を使用しま す。詳細については、「about_assignment_operators」を参照してください。次の例は、+= 代入演算 子を使用して項目を配列に追加する方法を示しています。 C:\PS> $array 1 2 3 C:\PS> $array + "file" 1 2 3 file C:\PS> $array 1 2 3 C:\PS> $array += "file" C:\PS> $array 1 2 3 file C:\PS> $hash1 Name Value ---- ----- a 1 b 2 c 3 C:\PS> $hash1 += @{e = 5} C:\PS> $hash1 Name Value ---- ----- a 1 b 2 e 5 c 3 Windows PowerShell では、精度を落とさずに結果を最適に表現できる .NET Framework の数値型が自動的に 選択されます。次にその例を示します。 C:\PS> 2 + 3.1 5.1 C:\PS> (2).GetType().FullName System.Int32 C:\PS> (2 + 3.1).GetType().FullName System.Double 演算の結果が型に対して大きすぎる場合、次の例に示すように、 その結果が収まるように結果の型が拡大変換されます。 C:\PS> (512MB).GetType().FullName System.Int32 C:\PS> (512MB * 512MB).GetType().FullName System.Double 結果の型は、必ずしもいずれかのオペランドと同じになるわけではありません。次の例は、 負の値を符号なし整数にキャストできないことと、符号なし整数は大きすぎて Int32 にはキャストできないことを示しています。 C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname System.Int64 この例で、Int64 にはどちらの型も格納できています。 System.Decimal 型は例外です。どちらかのオペランドが Decimal 型である場合、結果は Decimal 型になり ます。結果が Decimal 型には大きすぎる場合、Double にはキャストされません。代わりにエラーが表示さ れます。 C:\PS> [Decimal]::maxvalue 79228162514264337593543950335 C:\PS> [Decimal]::maxvalue + 1 Decimal 型の値が大きすぎるか、または小さすぎます。 行:1 文字:22 + [Decimal]::maxvalue + <<<< 1 算術演算子と変数 算術演算子は変数と共に使用することもできます。演算子は変数の値を操作します。 次の例は、変数と共に算術演算子を使用する方法を示しています。 C:\PS> $intA = 6 C:\PS> $intB = 4 C:\PS> $intA + $intB 10 C:\PS> $a = "Windows " C:\PS> $b = "PowerShell " C:\PS> $c = 2 C:\PS> $a + $b + $c Windows PowerShell 2 算術演算子とコマンド 通常、算術演算子は数値、文字列、および配列を含む式で使用します。 ただし、コマンドによって返されるオブジェクトと、これらのオブジェクトのプロパティと共に 算術演算子を使用することもできます。 次の例は、Windows PowerShell のコマンドを含む式で算術演算子を使用する方法を示しています。 C: \PS> get-date Wednesday, January 02, 2008 1:28:42 PM C: \PS> $day = new-timespan -day 1 C: \PS> get-date + $day Thursday, January 03, 2008 1:34:52 PM C: \PS> get-process | where {($_.ws * 2) -gt 50mb} Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1896 39 50968 30620 264 1,572.55 1104 explorer 12802 78 188468 81032 753 3,676.39 5676 OUTLOOK 660 9 36168 26956 143 12.20 988 powershell 561 14 6592 28144 110 1,010.09 496 services 3476 80 34664 26092 234 ...45.69 876 svchost 967 30 58804 59496 416 930.97 2508 WINWORD 例 次の例は、Windows PowerShell で算術演算子を使用する方法を示しています。 C:\PS> 1 + 1 2 C:\PS> 1 - 1 0 C:\PS> -(6 + 3) -9 C:\PS> 6 * 2 12 C:\PS> 7 / 2 3.5 C:\PS> 7 % 2 1 C:\PS> w * 3 www C:\PS> 3 * "w" 値 "w" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。" 行:1 文字:4 + 3 * <<<< "w" PS C:\ps-test> "Windows" + " " + "PowerShell" Windows PowerShell PS C:\ps-test> $a = "Windows" + " " + "PowerShell" PS C:\ps-test> $a Windows PowerShell C:\PS> $a[0] W C:\PS> $a = "TestFiles.txt" C:\PS> $b = "C:\Logs\" C:\PS> $b + $a C:\Logs\TestFiles.txt C:\PS> $a = 1,2,3 C:\PS> $a + 4 1 2 3 4 C:\PS> $servers = @{0 = "LocalHost"; 1 = "Server01"; 2 = "Server02"} C:\PS> $servers + @{3 = "Server03"} Name Value ---- ----- 3 Server03 2 Server02 1 Server01 0 LocalHost C:\PS> $servers Name Value ---- ----- 2 Server02 1 Server01 0 LocalHost C:\PS> $servers += @{3 = "Server03"} # 代入演算子を使用 C:\PS> $servers Name Value ---- ----- 3 Server03 2 Server02 1 Server01 0 LocalHost 関連項目 about_arrays about_assignment_operators about_comparison_operators about_hash_tables about_operators about_variables Get-Date New-TimeSpan