次の方法で共有


about_Arithmetic_Operators

簡単な説明

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

長い説明

算術演算子は数値を計算します。 1 つ以上の算術演算子を使用して、値を加算、減算、乗算、除算し、除算演算の剰余 (剰余) を計算できます。

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

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

PowerShell 3.0 以降では、 -shr (shift-right) と -shl (shift-left) が追加され、PowerShell でビットごとの算術演算がサポートされます。

PowerShell では、次の算術演算子がサポートされています。

演算子 説明
+ 整数を追加します。連結 6 + 2
文字列、配列、ハッシュ テーブル。 "file" + "name"
@(1, "one") + @(2.0, "two")
@{"one" = 1} + @{"two" = 2}
+ オブジェクトから数値を作成します + 123
- ある値を別のものから減算します 6 - 2
value
- 反対の数値を計算します - -6
(Get-Date).AddDays(-1)
* 数値を乗算するか、文字列をコピーする 6 * 2
および は、指定された数値を配列します @("!") * 4
時間の。 "!" * 3
/ 2 つの値を除算します。 6 / 2
% 剰余 - の剰余を返します 7 % 2
除算操作。
-バンド ビット演算子 AND 5 -band 3
-bnot ビットごとの NOT -bnot 5
-Bor ビットごとの OR 5 -bor 0x03
-bxor ビットごとの XOR 5 -bxor 3
-Shl ビットを左にシフトします 102 -shl 2
-Shr ビットを右にシフトします 102 -shr 2

ビット演算子は整数型でのみ機能します。

演算子の優先順位

PowerShell では、算術演算子は次の順序で処理されます。

優先順位 演算子 説明
1 () かっこ
2 - 負の数または単項演算子の場合
3 *, /, % 乗算と除算の場合
4 +, - 加算と減算の場合
5 -band, -bnot ビットごとの操作の場合
5 -bor, -bxor ビットごとの操作の場合
5 -shr, -shl ビットごとの操作の場合

PowerShell は、優先順位規則に従って左から右に式を処理します。 次の例は、優先順位ルールの効果を示しています。

正規表現 結果
3+6/3*4 11
3+6/(3*4) 3.5
(3+6)/3*4 12

PowerShell で式を評価する順序は、使用した他のプログラミング言語やスクリプト言語とは異なる場合があります。 次の例は、複雑な代入ステートメントを示しています。

$a = 0
$b = @(1,2)
$c = @(-1,-2)

$b[$a] = $c[$a++]

この例では、 式 $a++ は の前 $b[$a]に評価されます。 を評価すると$a++、 ステートメント$c[$a++]で使用された後、 の値$aが変更されますが、 で使用される前に $b[$a]が変更されます。 の変数$aは、 ではなく 0と等しい1ので$b[$a]、ステートメントは ではなく $b[0]に値を$b[1]割り当てます。

上記のコードは、次のコードと同じです。

$a = 0
$b = @(1,2)
$c = @(-1,-2)

$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp

除算と丸め

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

次の例は、最も近い偶数の整数に丸める効果を示しています。

正規表現 結果
[int]( 5 / 2 ) 2
[int]( 7 / 2 ) 4

5/2 = 2.52 に丸められることがわかります。 ただし、 7/2 = 3.54 に丸められます。

クラスを [Math] 使用すると、さまざまな丸め動作を取得できます。

正規表現 結果
[int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero) 3
[int][Math]::Ceiling(5 / 2) 3
[int][Math]::Floor(5 / 2) 2

詳細については、 Math.Round メソッドを参照してください。

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

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

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

たとえば、次のコマンドでは、2 つの配列を作成し、それらを追加します。

$a = 1,2,3
$b = "A","B","C"
$a + $b
1
2
3
A
B
C

また、さまざまな型のオブジェクトに対して算術演算を実行することもできます。 PowerShell が実行する操作は、操作の左端にあるオブジェクトの Microsoft .NET 型によって決まります。 PowerShell は、操作内のすべてのオブジェクトを最初のオブジェクトの .NET 型に変換しようとします。 オブジェクトの変換に成功すると、最初のオブジェクトの .NET 型に適した操作が実行されます。 いずれかのオブジェクトの変換に失敗した場合、操作は失敗します。

加算演算子と乗算演算子の使用例を次に示します。異なるオブジェクト型を含む操作では。 、、$blue = [ConsoleColor]::Blue: と$red = [ConsoleColor]::Red仮定します$array = 1,2,3

正規表現 結果
"file" + 16 file16
$array + 16 1,2,3,16
$array + "file" 1,2,3,file
$array * 2 1,2,3,1,2,3
"file" * 3 filefilefile
$blue + 3 Red
$red - 3 Blue
$blue - $red -3
+ '123' 123

ステートメントの評価に使用されるメソッドは左端のオブジェクトによって決定されるため、PowerShell での加算と乗算は厳密には可換ではありません。 たとえば、 (a + b) は常に と等しい (b + a)とは限らず、 (ab) が 常に と等しい (ba)とは限りません。

次の例は、この原則を示しています。

正規表現 結果
"file" + 16 file16
16 + "file" Cannot convert value "file" to type "System.Int32".
Error: "Input string was not in a correct format."
At line:1 char:1
+ 16 + "file"

ハッシュ テーブルは、少し異なるケースです。 追加されたハッシュ テーブルに重複するキーがない限り、ハッシュ テーブルを別のハッシュ テーブルに追加できます。

次の例では、相互にハッシュ テーブルを追加する方法を示します。

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c2="Server02"}
$hash1 + $hash2
Name                           Value
----                           -----
c2                             Server02
a                              1
b                              2
c1                             Server01
c                              3

次の例では、キーの 1 つが両方のハッシュ テーブルに重複しているため、エラーがスローされます。

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c="Server02"}
$hash1 + $hash2
Item has already been added. Key in dictionary: 'c'  Key being added: 'c'
At line:3 char:1
+ $hash1 + $hash2
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException

また、配列にハッシュ テーブルを追加することもできます。ハッシュ テーブル全体が配列内の項目になります。

$array1 = @(0, "Hello World", [datetime]::Now)
$hash1 = @{a=1; b=2}
$array2 = $array1 + $hash1
$array2
0
Hello World

Monday, June 12, 2017 3:05:46 PM

Key   : a
Value : 1
Name  : a

Key   : b
Value : 2
Name  : b

ただし、ハッシュ テーブルに他の型を追加することはできません。

$hash1 + 2
A hash table can only be added to another hash table.
At line:3 char:1
+ $hash1 + 2

加算演算子は非常に便利ですが、代入演算子を使用して、ハッシュ テーブルと配列に要素を追加します。 詳細については、「 about_assignment_operators」を参照してください。 次の例では、代入演算子を += 使用して配列に項目を追加します。

$array = @()
(0..9).foreach{ $array += $_ }
$array
0
1
2

結果に対応する型変換

PowerShell では、精度を失うことなく結果を最もよく表す .NET 数値型が自動的に選択されます。 例:

2 + 3.1
(2).GetType().FullName
(2 + 3.1).GetType().FullName
5.1
System.Int32
System.Double

操作の結果が型に対して大きすぎる場合は、次の例のように、結果の型が結果に合わせて拡大されます。

(512MB).GetType().FullName
(512MB * 512MB).GetType().FullName
System.Int32
System.Double

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

([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64

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

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

正規表現 結果
[Decimal]::maxvalue 79228162514264337593543950335
[Decimal]::maxvalue + 1 Value was either too large or too small for a
Decimal.

算術演算子と変数

変数で算術演算子を使用することもできます。 演算子は、変数の値に対して動作します。 次の例では、変数で算術演算子を使用する方法を示します。

正規表現 結果
$intA = 6
$intB = 4
$intA + $intB
10
$a = "Power"
$b = "Shell"
$a + $b
PowerShell

算術演算子とコマンド

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

次の例は、PowerShell コマンドを使用して式で算術演算子を使用する方法を示しています。

(get-date) + (new-timespan -day 1)

かっこ演算子は、コマンドレットの Get-Date 評価とコマンドレット式の評価を New-TimeSpan -Day 1 強制的にこの順序で行います。 その後、両方の結果が 演算子を + 使用して追加されます。

Get-Process | Where-Object { ($_.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

上記の式では、各プロセス作業空間 ($_.ws) に が乗算 2され、結果が と比較され 50mb 、それがそれより大きいかどうかを確認します。

ビットごとの演算子

PowerShell では、ビットごとの AND ()、包括的および排他的なビットごとの OR 演算子 ( と -bXor)、ビットごとの NOT (-bNot-bAnd-bOr) など、標準のビットごとの演算子がサポートされています。

PowerShell 2.0 以降では、すべてのビットごとの演算子は 64 ビット整数で動作します。

PowerShell 3.0 以降では、 -shr PowerShell でビットごとの算術演算をサポートするために、(shift-right) と -shl (shift-left) が導入されています。

PowerShell では、次のビットごとの演算子がサポートされています。

演算子 説明 結果
-band ビット演算子 AND 10 -band 3 2
-bor ビットごとの OR (両端を含む) 10 -bor 3 11
-bxor ビットごとの OR (排他的) 10 -bxor 3 9
-bnot ビットごとの NOT -bNot 10 -11
-shl Shift キーを押しながら左へ移動 102 -shl 2 408
-shr Shift キーを押しながら右に移動 102 -shr 1 51

ビットごとの演算子は、値のバイナリ形式で動作します。 たとえば、数値 10 のビット構造は (1 バイトに基づいて) 00001010され、数値 3 のビット構造は00000011。 ビットごとの演算子を使用して 10 から 3 を比較すると、各バイトの個々のビットが比較されます。

ビットごとの AND 演算では、結果のビットは両方の入力ビットが 1 の場合にのみ 1 に設定されます。

1010      (10)
0011      ( 3)
--------------  bAND
0010      ( 2)

ビットごとの OR (包括的) 演算では、どちらか一方または両方の入力ビットが 1 の場合、結果のビットは 1 に設定されます。 結果のビットは、両方の入力ビットが 0 に設定されている場合にのみ 0 に設定されます。

1010      (10)
0011      ( 3)
--------------  bOR (inclusive)
1011      (11)

ビットごとの OR (排他) 操作では、結果のビットは、1 つの入力ビットが 1 の場合にのみ 1 に設定されます。

1010      (10)
0011      ( 3)
--------------  bXOR (exclusive)
1001      ( 9)

ビットごとの NOT 演算子は、値の二項補数を生成する単項演算子です。 1 のビットは 0 に設定され、ビット 0 は 1 に設定されます。

たとえば、0 の二項補数は -1、最大符号なし整数 (0xffffffff)、-1 の二項補数は 0 です。

-bNot 10
-11
0000 0000 0000 1010  (10)
------------------------- bNOT
1111 1111 1111 0101  (-11, xfffffff5)

ビットごとのシフト左演算では、すべてのビットが "n" の位置を左に移動します。ここで、"n" は右オペランドの値です。 0 が 1 の場所に挿入されます。

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

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

正規表現 結果 バイナリの結果
21 -shl 0 21 0001 0101
21 -shl 1 42 0010 1010
21 -shl 2 84 0101 0100

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

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

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

正規表現 結果 Binary Hex
21 -shr 0 21 0001 0101 0x15
21 -shr 1 10 0000 1010 0x0A
21 -shr 2 5 0000 0101 0x05
21 -shr 31 0 0000 0000 0x00
21 -shr 32 21 0001 0101 0x15
21 -shr 64 21 0001 0101 0x15
21 -shr 65 10 0000 1010 0x0A
21 -shr 66 5 0000 0101 0x05
[int]::MaxValue -shr 1 1073741823 0x3FFFFFFF
[int]::MinValue -shr 1 -1073741824 0xC0000000
-1 -shr 1 -1 0xFFFFFFFF

こちらもご覧ください