about_Arithmetic_Operators
簡単な説明
PowerShell で算術演算を実行する演算子について説明します。
長い説明
算術演算子は数値を計算します。 1 つ以上の算術演算子を使用して、値を加算、減算、乗算、除算し、除算演算の剰余 (剰余) を計算できます。
さらに、加算演算子 (+) と乗算演算子 (*) は、文字列、配列、およびハッシュ テーブルでも動作します。 加算演算子は入力を連結します。 乗算演算子は、入力の複数のコピーを返します。 算術ステートメントでオブジェクト型を混在することもできます。 ステートメントの評価に使用されるメソッドは、式の左端のオブジェクトの型によって決まります。
PowerShell 2.0 から、すべての算術演算子は 64 ビット数値で動作します。
PowerShell 3.0 -shr から、PowerShell でビット演算をサポートするために (シフト右) -shl と (シフト左) が追加されます。
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 |
| 除算操作。 | ||
| -band | ビット演算子 AND | 5 -band 3 |
| -bnot | ビットごとの NOT | -bnot 5 |
| -最も良い | ビットごとの OR | 5 -bor 0x03 |
| -bxor | ビットごとの XOR | 5 -bxor 3 |
| -shl | ビットを左にシフトします | 102 -shl 2 |
| -shr | ビットを右にシフトします | 102 -shr 2 |
ビット演算子は整数型でのみ機能します。
演算子の優先順位
PowerShell は、算術演算子を次の順序で処理します。
| 優先順位 | 演算子 | 説明 |
|---|---|---|
| 1 | () |
かっこ |
| 2 | - |
負の数または 1 項演算子の場合 |
| 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++ すると、 ステートメントで使用 $a された後の の値が変更されますが $c[$a++]、 で使用される前に が変更されます $b[$a]。 内の $a 変数は $b[$a] と等しく 1、ではありません 0。したがって、 ステートメントでは、 ではなく に値が割 $b[1]り当てされます $b[0]。
上記のコードは、次のコードと同じです。
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp
除算と丸め
除算演算の商が整数の場合、PowerShell は値を最も近い整数に丸められます。 値が の場合 .5、最も近い even 整数に丸められます。
次の例は、最も近い even 整数に丸めを適用した場合の効果を示しています。
| 正規表現 | 結果 |
|---|---|
[int]( 5 / 2 ) |
2 |
[int]( 7 / 2 ) |
4 |
5/2 = 2.5 が 2 に丸 められます。 ただし、 7/2 = 3.5 は 4 に丸められます。
クラスを使用して、 [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 型に適した操作が実行されます。 オブジェクトの変換に失敗した場合、操作は失敗します。
次の例では、加算演算子と乗算演算子の使用を示します。さまざまなオブジェクトの種類を含む操作。
、、、 を$array = 1,2,3``$red = [ConsoleColor]::Red想定します$blue = [ConsoleColor]::Blue。
| 正規表現 | 結果 |
|---|---|
"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 ()、包括ビット演算子と排他的ビット演算子 (-bOr``-bXorおよび )、ビット演算子 NOT (-bAnd) など、標準のビット演算子がサポートされています-bNot。
PowerShell 2.0 より、すべてのビット演算子は 64 ビット整数で動作します。
PowerShell 3.0 -shr から、PowerShell でビット演算をサポートするために (シフト右) -shl と (シフト左) が導入されました。
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 -left | 102 -shl 2 |
408 |
-shr |
Shift キーを押しながら右 | 102 -shr 1 |
51 |
ビット演算子は、値のバイナリ形式に作用します。 たとえば、数値 10 のビット構造は (1 バイト00001010)、数値 3 のビット構造は 1 バイト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 項演算子です。 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 つの場所に挿入されます。
左オペランドが整数 (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" は右オペランドで指定されます。 シフト右演算子 (-shr) は、正の値または符号なし値を右にシフトするときに、一番左の位置にゼロを挿入します。
左オペランドが整数 (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 |
関連項目
フィードバック
フィードバックの送信と表示