about_Arithmetic_Operators

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0

概要をここに挿入してください。

トピック

about_Arithmetic_Operators

概要

Windows PowerShell® で計算を実行する演算子について説明します。

詳細説明

算術演算子は数値を計算します。1 つまたは複数の算術演算子を使用して、加算、減算、乗算、および除算を行い、除算の余り (剰余) を計算できます。

さらに、加算演算子 (+) および乗算演算子 (*) は文字列、配列、およびハッシュ テーブルでも操作可能です。加算演算子は入力を連結します。乗算演算子は入力の複数のコピーを返します。算術演算のステートメントでオブジェクトの種類を混在させることもできます。ステートメントの評価に使用するメソッドは、式の左端のオブジェクトの種類によって決まります。

Windows PowerShell 2.0 以降、すべての算術演算子が 64 ビット数で動作します。

Windows PowerShell 3.0 以降、Windows PowerShell でのビットごとの演算をサポートするために、-shr (右シフト) と -shl (左シフト) が追加されています。

Windows PowerShell は次の算術演算子をサポートしています。

Operator  Description                             Example
--------  -----------                             -------
+         Adds integers; concatenates strings,    6+2
          arrays, and hash tables.                "file" + "name"
-        Subtracts one value from another        6-2
          value.                                  (get-date).date - 1
-        Makes a number a negative number.       -6+2
                                                  -4
*         Multiplies integers; copies strings     6*2
          and arrays the specified number of      "w" * 3
          times.
/         Divides two values.                     6/2
%         Returns the remainder of a division     7%2
          operation.
-shl      Shift-left                              100 -shl 2
-shr      Shift-right                             100 -shr 1

演算子の優先順位

Windows PowerShell は次の順序での算術演算子を処理します。

        Parentheses ()
        - (for a negative number)
        *, /, %
        +, - (for subtraction)

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 は 1 に等しく、0 ではないため、ステートメントは値を $b[0] ではなく $b[1] に代入します。

除算と丸め

除算演算の商が整数の場合、Windows PowerShell は値を最も近い整数値に丸めます。値が .5 である場合は、最も近い偶数に丸められます。

次の例は最も近い偶数への丸め処理の影響を示します。

C:\PS> [int]( 5 / 2 )
        2

C:\PS> [int]( 7 / 2 )
        4

数値以外の型の加算と乗算

数値、文字列、配列、およびハッシュ テーブルを加算できます。また、数値、文字列、および配列を乗算できます。ただし、ハッシュ テーブルを乗算することはできません。

文字列、配列、またはハッシュ テーブルを加算すると、要素が連結されます。配列やハッシュ テーブルなどのコレクションを連結すると、両方のコレクションからのオブジェクトを含む新しいオブジェクトが作成されます。キーが同じであるハッシュ テーブルを連結しようとする場合、操作は失敗します。

たとえば、次のコマンドは 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 は演算中のすべてのオブジェクトを最初のオブジェクトの .NET Framework の型に変換しようとします。オブジェクトの変換に成功した場合、最初のオブジェクトの .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"
        Cannot convert value "file" to type "System.Int32". Error: "Input
        string was not in a correct format."
        At line:1 char:4
        + 2 + <<<<  "file"

C:\PS> "file" * 3
        filefilefile

C:\PS> 3 * "file"
        Cannot convert value "file" to type "System.Int32". Error: "Input 
        string was not in a correct format."
        At line:1 char: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
You can add another hash table only to a hash table.
At line:1 char:9
+ $hash1 + <<<<  2

C:\PS> 2 + $hash1
Cannot convert "System.Collections.Hashtable" to "System.Int32".
At line:1 char:4
+ 2 + <<<<  $hash1

次の例は、ハッシュ テーブルを配列に加算できることを示します。ハッシュ テーブルの全体は、1 つのオブジェクトとして、配列に加算されます。

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
Bad argument to operator '+': Item has already been added. 
Key in dictionary: 'c'    Key being added: 'c'.
At line:1 char: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

結果の型は必ずしもオペランドの 1 つと同じであるとは限りません。次の例で、負の値は符号なし整数にキャストすることはできませんし、符号なし整数が大きすぎて Int32 型にキャストできません。

C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64

この例で Int64 は両方の型に対応できます。

System.Decimal 型は例外です。オペランドのいずれかが 10 進数型の場合、結果は 10 進数型になります。結果が 10 進数型には大きすぎる場合、Double にキャストされません。代わりに、エラーが発生します。

C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
Value was either too large or too small for a Decimal.
At line:1 char: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 PowerShell2

算術演算子とコマンド

通常、算術演算子は数値、文字列、および配列を含む式で使用します。ただし、算術演算子をコマンドが返すオブジェクトおよびそれらのオブジェクトのプロパティとともに使用することもできます。

次の例は、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" 
Cannot convert value "w" to type "System.Int32". Error: "Input string was not in a correct format." 
At line:1 char: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"} #Use assignment operator 
C:\PS> $servers 
Name Value 
---- ----- 
3 Server03 
2 Server02 
1 Server01 
0 LocalHost

Windows PowerShell でのビット単位の算術

Windows PowerShell はビットごとの算術に対して、shl (左シフト) および -shr (右シフト) 演算子をサポートします。

これらの演算子は Windows PowerShell 3.0 で導入されました。

ビットごとの左シフト演算では、すべてのビットが "n" 桁左に移動します。"n" は、右オペランドの値です。最下位の桁にはゼロが挿入されます。

左オペランドが整数 (32 ビット) 値の場合は、右オペランドの下位 5 ビットによって、シフトする左オペランドのビット数が決まります。

左オペランドが Long (64 ビット) 値の場合は、右オペランドの下位 6 ビットによって、シフトする左オペランドのビット数が決まります。

PS C:\> 21 -shl 1
42

00010101  (21)
00101010  (42)

PS C:\> 21 -shl 2
84

00010101  (21)
00101010  (42)
01010100  (84)

ビットごとの右シフト演算では、すべてのビットが "n" 桁右に移動します。"n" は、右オペランドによって指定されます。右シフト演算子 (-shr) は、正の値または符号なしの値を右にシフトするときに、一番左の位置にゼロを挿入します。

左オペランドが整数 (32 ビット) 値の場合は、右オペランドの下位 5 ビットによって、シフトする左オペランドのビット数が決まります。

左オペランドが Long (64 ビット) 値の場合は、右オペランドの下位 6 ビットによって、シフトする左オペランドのビット数が決まります。

PS C:\> 21 -shr 1
10

00010101  (21)
00001010  (10)

PS C:\> 21 -shr 2
5

00010101  (21)
00001010  (10)
00000101  ( 5)

関連項目

about_arrays

about_assignment_operators

about_comparison_operators

about_hash_tables

about_operators

about_variables

Get-Date

Get-Date

New-TimeSpan