about_Operators
簡単な説明
PowerShell でサポートされている演算子について説明します。
詳細な説明
演算子は、コマンドまたは式で使用できる言語要素です。 PowerShell では、値の操作に役立ついくつかの種類の演算子がサポートされています。
算術演算子
算術演算子 (+
、 -
、 *
、 /
、 %
) を使用して、コマンドまたは式の値を計算します。 これらの演算子を使用すると、値を加算、減算、乗算、または除算し、除算演算の剰余 (剰余) を計算できます。
加算演算子は要素を連結します。 乗算演算子は、各要素の指定された数のコピーを返します。 Int
、String
、DateTime
、Hashtable
、配列など、それらを実装する任意の .NET 型で算術演算子を使用できます。
ビット演算子 (-band
、 -bor
、 -bxor
、 -bnot
、 -shl
、 -shr
) は、値のビット パターンを操作します。
詳細については、「 about_Arithmetic_Operators」を参照してください。
代入演算子
代入演算子 (=
、 +=
、 -=
、 *=
、 /=
、 %=
) を使用して、変数に値を代入、変更、または追加します。 算術演算子と代入を組み合わせて、算術演算の結果を変数に割り当てることができます。
詳細については、「 about_Assignment_Operators」を参照してください。
比較演算子
比較演算子 (-eq
、 -ne
、 -gt
、 -lt
、 -le
、 -ge
) を使用して、値とテスト条件を比較します。 たとえば、2 つの文字列値を比較して、それらが等しいかどうかを判断できます。
比較演算子には、テキスト内のパターンを検索または置換する演算子も含まれます。 (-match
、 -notmatch
、 -replace
) 演算子は正規表現を使用し、(-like
、 -notlike
) はワイルドカード *
使用します。
包含比較演算子は、テスト値が参照セット (-in
、 -notin
、 -contains
、 -notcontains
) に表示されるかどうかを決定します。
型比較演算子 (-is
、 -isnot
) は、オブジェクトが特定の型であるかどうかを判断します。
詳細については、「 about_Comparison_Operators」を参照してください。
論理演算子
論理演算子 (-and
、 -or
、 -xor
、 -not
、 !
) を使用して、条件付きステートメントを単一の複雑な条件に接続します。 たとえば、論理 -and
演算子を使用して、2 つの異なる条件を持つオブジェクト フィルターを作成できます。
詳細については、「 about_Logical_Operators」を参照してください。
リダイレクト演算子
リダイレクト演算子 (>
、 >>
、 2>
、 2>>
、および 2>&1
) を使用して、コマンドまたは式の出力をテキスト ファイルに送信します。 リダイレクト演算子は、 Out-File
コマンドレット (パラメーターなし) と同様に機能しますが、エラー出力を指定されたファイルにリダイレクトすることもできます。 Tee-Object
コマンドレットを使用して出力をリダイレクトすることもできます。
詳細については、 about_Redirectionを参照してください。
分割演算子と結合演算子
-split
演算子と-join
演算子は、部分文字列を分割して結合します。 -split
演算子は、文字列を部分文字列に分割します。 -join
演算子は、複数の文字列を 1 つの文字列に連結します。
詳細については、「 about_Split と about_Join」を参照してください。
型演算子
オブジェクトの .NET 型を検索または変更するには、型演算子 (-is
、 -isnot
、 -as
) を使用します。
詳細については、 about_Type_Operatorsを参照してください。
単項演算子
単項 ++
演算子と --
演算子を使用して、値をインクリメントまたはデクリメントし、否定に -
します。 たとえば、変数 $a
を 9
から 10
にインクリメントするには、 $a++
入力します。
詳細については、「 about_Arithmetic_Operators」を参照してください。
特殊演算子
特殊な演算子には、他の演算子グループに収まらない特定のユース ケースがあります。 たとえば、特殊な演算子を使用すると、コマンドを実行したり、値のデータ型を変更したり、配列から要素を取得したりできます。
グループ化演算子 ( )
他の言語と同様に、 (...)
は式の演算子の優先順位をオーバーライドする役割を果たします。 例: (1 + 2) / 3
ただし、PowerShell では、追加の動作があります。
結果式のグループ化
(...)
を使用すると、 command からの出力を式に参加できます。
次に例を示します。
PS> (Get-Item *.txt).Count -gt 10
True
Note
コマンドをかっこで囲むと、囲まれたコマンド自体が$false
に$?
設定されている場合でも、自動変数$?
が$true
に設定されます。
たとえば、 (Get-Item /Nosuch); $?
が予期せず Trueを生成します。 $?
の詳細については、「about_Automatic_Variables」を参照してください。
グループ化された式のパイプ処理
パイプラインの最初のセグメントとして使用する場合、コマンドまたは式をかっこで囲むと、式の結果の 解除 が常に発生します。 かっこが command をラップする場合、結果がパイプラインを介して送信される前にすべての出力メモリに取り込まれて完了するまで実行されます。
たとえば、これらのステートメントの出力は異なります。
PS> ConvertFrom-Json '["a", "b"]' | ForEach-Object { "The value is '$_'" }
The value is 'a b'
PS> (ConvertFrom-Json '["a", "b"]') | ForEach-Object { "The value is '$_'" }
The value is 'a'
The value is 'b'
パイプ処理の前に式をグループ化することで、後続のオブジェクトごとの処理が、コマンドが出力の生成に使用する列挙に干渉することができなくなります。
たとえば、 Get-ChildItem
から Rename-Item
に出力をパイプ処理すると、項目の名前が変更され、再度検出されて 2 回目に名前が変更されるという予期しない影響が生じる可能性があります。
割り当てステートメントのグループ化
グループ化されていない代入ステートメントは値を出力しません。 代入ステートメントをグループ化する場合、割り当てられた変数の値は 通過 大きな式で使用できます。 次に例を示します。
PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True
ステートメントをかっこで囲んでラップすると、 $var
の値を出力する式になります。
この動作は、 +=
などの複合演算子、インクリメント (++
) 演算子、デクリメント (--
) 演算子など、すべての代入演算子に適用されます。
ただし、インクリメントとデクリメントの操作の順序は、その位置によって異なります。
PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1
プレフィックスの場合、 $i
の値は出力される前にインクリメントされます。 後置の場合、 $i
の値は出力後にインクリメントされます。
この手法は、 if
ステートメントなどの条件付きステートメントのコンテキストでも使用できます。
if ($textFiles = Get-ChildItem *.txt) {
$textFiles.Count
}
この例では、一致するファイルがない場合、 Get-ChildItem
コマンドは何も返せず、 $textFiles
に何も割り当てず、ブール型コンテキストで $false
と見なされます。 1 つ以上の FileInfo オブジェクトが $textFiles
に割り当てられている場合、条件付きは $true
に評価されます。 if
ステートメントの本文で$textFiles
の値を操作できます。
Note
この手法は便利で簡潔ですが、代入演算子 (=
) と等値比較演算子 (-eq
) の間で混乱を招く可能性があります。
Subexpression 演算子 $( )
1 つ以上のステートメントの結果を返します。 1 つの結果の場合は、 scalar を返します。 複数の結果の場合は、配列を返します。 これは、別の式内で式を使用する場合に使用します。 たとえば、コマンドの結果を文字列式に埋め込む場合です。
PS> "Today is $(Get-Date)"
Today is 12/02/2019 13:15:20
PS> "Folder list: $((dir c:\ -dir).Name -join ', ')"
Folder list: Program Files, Program Files (x86), Users, Windows
配列部分式演算子 @( )
1 つ以上のステートメントの結果を配列として返します。 結果は常に 0 個以上のオブジェクトの配列になります。
PS> $list = @(Get-Process | Select-Object -First 10; Get-Service | Select-Object -First 10 )
PS> $list.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> $list.Count
20
PS> $list = @(Get-Service | Where-Object Status -eq Starting )
PS> $list.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> $list.Count
0
ハッシュ テーブルのリテラル構文 @{}
配列部分式と同様に、この構文を使用してハッシュ テーブルを宣言します。 詳細については、「 about_Hash_Tables」を参照してください。
呼び出し演算子 &
コマンド、スクリプト、またはスクリプト ブロックを実行します。 呼び出し演算子 ( invocation 演算子とも呼ばれます) を使用すると、変数に格納され、文字列またはスクリプト ブロックで表されるコマンドを実行できます。 呼び出し演算子は子スコープで実行されます。 スコープの詳細については、「 about_Scopes」を参照してください。 これを使用して、必要なコマンド、パラメーター、および引数を含む文字列を作成し、コマンドのように文字列を呼び出すことができます。 作成する文字列は、コマンド ラインで入力したコマンドと同じ解析規則に従う必要があります。 詳細については、 about_Parsingを参照してください。
次の使用例は、コマンドを文字列に格納し、呼び出し演算子を使用して実行します。
PS> $c = "get-executionpolicy"
PS> $c
get-executionpolicy
PS> & $c
AllSigned
呼び出し演算子は文字列を解析しません。 つまり、呼び出し演算子を使用する場合、文字列内でコマンド パラメーターを使用することはできません。
PS> $c = "Get-Service -Name Spooler"
PS> $c
Get-Service -Name Spooler
PS> & $c
& : The term 'Get-Service -Name Spooler' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.
At line:1 char:2
+ & $c
+ ~~
+ CategoryInfo : ObjectNotFound: (Get-Service -Name Spooler:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Invoke-Expression コマンドレットは、呼び出し演算子を使用するときに解析エラーを引き起こすコードを実行できます。
PS> & "1+1"
&: The term '1+1' is not recognized as a name of a cmdlet, function, script
file, or executable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.
At line:1 char:2
+ & "1+1"
+ ~~~~~
+ CategoryInfo : ObjectNotFound: (1+1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS> Invoke-Expression "1+1"
2
スクリプトは、そのファイル名を使用して実行できます。 スクリプト ファイルを実行可能にするには、 .ps1
ファイル拡張子が必要です。 パスにスペースがあるファイルは、引用符で囲む必要があります。 引用符で囲まれたパスを実行しようとすると、スクリプトを実行する代わりに、PowerShell によって引用符で囲まれた文字列の内容が表示されます。 呼び出し演算子を使用すると、ファイル名を含む文字列の内容を実行できます。
PS C:\Scripts> Get-ChildItem
Directory: C:\Scripts
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/28/2018 1:36 PM 58 script name with spaces.ps1
PS C:\Scripts> ".\script name with spaces.ps1"
.\script name with spaces.ps1
PS C:\Scripts> & ".\script name with spaces.ps1"
Hello World!
スクリプト ブロックの詳細については、 about_Script_Blocksを参照してください。
キャスト演算子 [ ]
オブジェクトを指定した型に変換または制限します。 オブジェクトを変換できない場合、PowerShell によってエラーが生成されます。
[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'
キャストは、 キャスト表記を使用して変数を割り当てるときにも実行。
コンマ演算子 ,
二項演算子として、コンマは配列を作成するか、作成される配列に追加します。 式モードでは、単項演算子として、コンマは 1 つのメンバーのみを含む配列を作成します。 メンバーの前にコンマを置く。
$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)
Write-Output
は引数を受け取るので、式をかっこで囲む必要があります。
ドット ソーシング演算子 .
スクリプトを現在のスコープで実行して、スクリプトによって作成されるすべての関数、エイリアス、変数が現在のスコープに追加され、既存のスコープがオーバーライドされるようにします。 スクリプトによって宣言されたパラメーターは変数になります。 値が指定されていないパラメーターは、値のない変数になります。 ただし、自動変数 $args
は保持されます。
. c:\scripts\sample.ps1 1 2 -Also:3
Note
ドット ソーシング演算子の後にスペースが続きます。 スペースを使用して、現在のディレクトリを表すドット (.
) 記号とドットを区別します。
次の例では、現在のディレクトリの Sample.ps1 スクリプトが現在のスコープで実行されます。
. .\sample.ps1
Format 演算子 -f
.NET 複合書式設定機能へのアクセスを提供します。 複合書式指定文字列は、 format アイテムと呼ばれるインデックス付きプレースホルダーと混在する固定テキストで構成。 この書式指定項目は、リスト内のオブジェクトに対応します。
各書式指定項目は、次の形式を使用し、次のコンポーネントで構成されます。
{index[,alignment][:formatString]}
対になった中かっこ ({
と }
) が必要です。
書式設定操作によって生成される結果の文字列は、元の固定テキストに文字列で表されたリスト内のオブジェクトが混合されて構成されます。 詳細については、「複合書式指定」をご覧ください。
演算子の左側に複合書式指定文字列を入力し、演算子の右側に書式設定するオブジェクトを入力します。
"{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
1 hello 3.14
"0" カスタム指定子を使用して、数値をゼロパッドできます。 :
に続くゼロの数は、書式設定された文字列の埋め込み幅の最大値を示します。
"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365
書式設定された文字列に中かっこ ({}
) を保持する必要がある場合は、中かっこを 2 倍にしてエスケープできます。
"{0} vs. {{0}}" -f 'foo'
foo vs. {0}
Index 演算子 [ ]
配列やハッシュ テーブルなど、インデックス付きコレクションからオブジェクトを選択します。 配列インデックスは 0 から始まるため、最初のオブジェクトは [0]
としてインデックスが作成されます。 負のインデックスを使用して最後の値を取得することもできます。 ハッシュ テーブルは、キー値によってインデックスが作成されます。
インデックスの一覧を指定すると、インデックス演算子は、それらのインデックスに対応するメンバーのリストを返します。
PS> $a = 1, 2, 3
PS> $a[0]
1
PS> $a[-1]
3
PS> $a[2, 1, 0]
3
2
1
(Get-HotFix | Sort-Object installedOn)[-1]
$h = @{key="value"; name="PowerShell"; version="2.0"}
$h["name"]
PowerShell
$x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
$x["doc"]
intro
-----
Once upon a time...
オブジェクトがインデックス付きコレクションでない場合、インデックス演算子を使用して最初の要素にアクセスすると、オブジェクト自体が返されます。 最初の要素を超えるインデックス値は、 $null
を返します。
PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True
パイプライン演算子 |
その前にあるコマンドの出力を、その後のコマンドに送信 ("pipes") します。 出力に複数のオブジェクト ("コレクション") が含まれている場合、パイプライン演算子は一度に 1 つずつオブジェクトを送信します。
Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}
範囲演算子 ..
範囲演算子は、連続する整数の配列を表すために使用できます。 範囲演算子で結合された値は、範囲の開始値と終了値を定義します。
1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}
逆の順序で範囲を作成することもできます。
10..1
5..-5 | ForEach-Object {Write-Output $_}
範囲の開始値と終了値には、整数または文字に評価される任意の式のペアを指定できます。 範囲のエンドポイントは、符号付き 32 ビット整数 ([int32]
) に変換できる必要があります。 値を大きくすると、エラーが発生します。 また、範囲が配列にキャプチャされる場合、結果の配列のサイズは 268435448
(または 256mb - 8
) に制限されます。 これは、.NET Framework の配列の最大サイズです。
たとえば、列挙型のメンバーを開始値と終了値に使用できます。
PS> enum Food {
Apple
Banana = 3
Kiwi = 10
}
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10
重要
結果の範囲は、列挙型の値に限定されません。 代わりに、指定された 2 つの値の間の値の範囲を表します。 範囲演算子を使用して、列挙体のメンバーを確実に表すことはできません。
メンバー アクセス演算子 .
オブジェクトのプロパティとメソッドにアクセスします。 メンバー名には式を指定できます。
$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }
PowerShell 3.0 以降では、メンバーを持たないリスト コレクション オブジェクトで演算子を使用すると、PowerShell はそのコレクション内の項目を自動的に列挙し、それぞれの演算子を使用します。 詳細については、「 about_Member-Access_Enumeration」を参照してください。
静的メンバー演算子 ::
.NET クラスの静的プロパティとメソッドを呼び出します。 オブジェクトの静的プロパティとメソッドを検索するには、 Get-Member
コマンドレットの Static パラメーターを使用します。 メンバー名には式を指定できます。
[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }
関連項目
PowerShell