about_Operators

簡単な説明

PowerShell でサポートされる演算子について説明します。

長い説明

演算子は、コマンドまたは式で使用できる言語要素です。 PowerShell では、値の操作に役立ついくつかの種類の演算子がサポートされています。

算術演算子

算術演算子 (+-*/%) を使用して、コマンドまたは式の値を計算します。 これらの演算子を使用すると、値を加算、減算、乗算、または除算し、除算演算の剰余 (剰余) を計算できます。

加算演算子は要素を連結します。 乗算演算子は、各要素の指定されたコピー数を返します。 算術演算子は、および Array などIntStringDateTimeHashtable、それらを実装する任意の .NET 型で使用できます。

ビットごとの演算子 (-band-bor-bxor-bnot、、-shl-shr) は、値のビット パターンを操作します。

詳細については、「 about_Arithmetic_Operators」を参照してください。

代入演算子

代入演算子 (=+=-=*=/=) %=を使用して、変数に値を割り当てる、変更する、または追加します。 算術演算子と代入を組み合わせて、算術演算の結果を変数に割り当てることができます。

詳細については、「 about_Assignment_Operators」を参照してください。

比較演算子

値とテスト条件を比較するには、比較演算子 (-eq-gt-ne、、-lt、、-le) -geを使用します。 たとえば、2 つの文字列値を比較して、それらが等しいかどうかを判断できます。

比較演算子には、テキスト内のパターンを検索または置換する演算子も含まれます。 (-match、、-notmatch-replace) 演算子は正規表現を使用し、(-like-notlike) はワイルドカードを使用します*

包含比較演算子は、テスト値が参照セット (-in-notin-contains-notcontains) に表示されるかどうかを判断します。

型比較演算子 (-is、) は、 -isnotオブジェクトが特定の型であるかどうかを判断します。

詳細については、「 about_Comparison_Operators」を参照してください。

論理演算子

論理演算子 (-and-or-xor-not!) を使用して、条件付きステートメントを 1 つの複雑な条件に接続します。 たとえば、論理 -and 演算子を使用して、2 つの異なる条件を持つオブジェクト フィルターを作成できます。

詳細については、「 about_Logical_Operators」を参照してください。

リダイレクト演算子

リダイレクト演算子 (>2>>>>2>、および 2>&1) を使用して、コマンドまたは式の出力をテキスト ファイルに送信します。 リダイレクト演算子はコマンドレット (パラメーターなし) と同様に Out-File 機能しますが、エラー出力を指定されたファイルにリダイレクトすることもできます。 コマンドレットを使用して Tee-Object 出力をリダイレクトすることもできます。

詳細については、「about_Redirection」を参照してください。

分割演算子と結合演算子

演算子と -join 演算子は-split、部分文字列を分割して結合します。 演算子は -split 、文字列を部分文字列に分割します。 演算子は -join 、複数の文字列を 1 つの文字列に連結します。

詳細については、「 about_Splitabout_Join」を参照してください。

型演算子

オブジェクトの.NET Framework型を検索または変更するには、型演算子 (-is、、-isnot-as) を使用します。

詳細については、「 about_Type_Operators」を参照してください。

単項演算子

単項 ++ 演算子と -- 演算子を使用して、値をインクリメントまたはデクリメントし、 - 否定を行います。 たとえば、 から に変数$aをインクリメントするには、「 」と入力します$a++109

詳細については、「 about_Arithmetic_Operators」を参照してください。

特殊演算子

特殊な演算子には、他の演算子グループに収まらない特定のユース ケースがあります。 たとえば、特殊な演算子を使用すると、コマンドを実行したり、値のデータ型を変更したり、配列から要素を取得したりできます。

グループ化演算子 ( )

他の言語と同様に、 (...) は式の演算子の優先順位をオーバーライドします。 例: (1 + 2) / 3

ただし、PowerShell では、追加の動作があります。

(...) を使用すると、 コマンド からの出力を式に参加させることができます。 次に例を示します。

PS> (Get-Item *.txt).Count -gt 10
True

割り当てステートメントのグループ化

グループ化されていない代入ステートメントでは、値は出力されません。 代入ステートメントをグループ化すると、割り当てられた変数の値が 渡され 、より大きな式で使用できます。 次に例を示します。

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値を操作できます。

注意

この手法は便利で簡潔ですが、代入演算子 () と等値比較演算子 (=-eq) の間で混乱を招く可能性があります。

グループ化された式のパイプ処理

パイプラインの最初のセグメントとして使用する場合、コマンドまたは式をかっこで囲むと、必ず式の結果が 列挙 されます。 かっこで コマンドをラップすると、結果がパイプラインを介して送信される前に 、メモリに収集 されたすべての出力が完了するまで実行されます。

Subexpression 演算子 $( )

1 つ以上のステートメントの結果を返します。 1 つの結果の場合、 はスカラーを返します。 複数の結果の場合、 は配列を返します。 これは、別の式内で式を使用する場合に使用します。 たとえば、コマンドの結果を文字列式に埋め込む場合です。

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」を参照してください。

呼び出し演算子 &

コマンド、スクリプト、またはスクリプト ブロックを実行します。 呼び出し演算子 ("呼び出し演算子" とも呼ばれます) を使用すると、変数に格納され、文字列またはスクリプト ブロックで表されるコマンドを実行できます。 呼び出し演算子は、子スコープで実行されます。 スコープの詳細については、「 about_Scopes」を参照してください。

次の使用例は、コマンドを文字列に格納し、呼び出し演算子を使用して実行します。

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.

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.

PS> Invoke-Expression "1+1"
2

呼び出し演算子を使用して、ファイル名を使用してスクリプトを実行できます。 次の例は、スペースを含むスクリプト ファイル名を示しています。 スクリプトを実行しようとすると、代わりに、ファイル名を含む引用符で囲まれた文字列の内容が 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」を参照してください。

Background 演算子 &

PowerShell ジョブで、バックグラウンドでパイプラインの前にパイプラインを実行します。 この演算子は、UNIX 制御演算子アンパサンド (&) と同様に動作します。この演算子は、コマンドをジョブとしてサブシェルで非同期的に実行する前に実行します。

この演算子は、機能的には と Start-Job同等です。 既定では、バックグラウンド演算子は、並列タスクを開始した呼び出し元の現在の作業ディレクトリでジョブを開始します。 次の例では、バックグラウンド ジョブ演算子の基本的な使用方法を示します。

Get-Process -Name pwsh &

このコマンドは、 の次の使用法と機能的に同等です Start-Job

Start-Job -ScriptBlock {Get-Process -Name pwsh}

と同様 Start-Jobに、バックグラウンド演算子は & オブジェクトを Job 返します。 このオブジェクトは、ジョブの開始に使用した場合と同様に、 と Remove-JobReceive-Job使用Start-Jobできます。

$job = Get-Process -Name pwsh &
Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Remove-Job $job

&バックグラウンド演算子は、UNIX コントロール演算子アンパサンド (&) と同様に、ステートメント ターミネータでもあります。 これにより、バックグラウンド演算子の後に追加のコマンドを & 呼び出すことができます。 次の例では、バックグラウンド演算子の後に追加のコマンドを呼び出す方法を & 示します。

$job = Get-Process -Name pwsh & Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

これは、次のスクリプトと同じです。

$job = Start-Job -ScriptBlock {Get-Process -Name pwsh}
Receive-Job $job -Wait

複数のコマンドを実行する場合は、それぞれ独自のバックグラウンド プロセスで実行しますが、すべて 1 行に配置するだけで、各コマンドの間と後に配置 & します。

Get-Process -Name pwsh & Get-Service -Name BITS & Get-CimInstance -ClassName Win32_ComputerSystem &

PowerShell ジョブの詳細については、「 about_Jobs」を参照してください。

キャスト演算子 [ ]

オブジェクトを指定した型に変換または制限します。 オブジェクトを変換できない場合、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

注意

ドット ソーシング演算子の後にスペースが続きます。 スペースを使用して、現在のディレクトリを表すドット (.) 記号とドットを区別します。

次の例では、現在のディレクトリ内のSample.ps1 スクリプトが現在のスコープで実行されています。

. .\sample.ps1

Format 演算子 -f

文字列オブジェクトの書式指定メソッドを使用して文字列を書式設定します。 演算子の左側に書式指定文字列を入力し、演算子の右側に書式設定するオブジェクトを入力します。

"{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}

詳細については、「 String.Format メソッド」および 「複合書式」を参照してください。

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...

オブジェクトがインデックス付きコレクションでない場合、index 演算子を使用して最初の要素にアクセスすると、オブジェクト自体が返されます。 最初の要素を超えるインデックス値は を返します $null

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

パイプライン演算子 |

その前にあるコマンドの出力を、その後のコマンドに送信 ("パイプ") します。 出力に複数のオブジェクト ("コレクション") が含まれている場合、パイプライン演算子はオブジェクトを一度に 1 つずつ送信します。

Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}

パイプライン チェーン演算子 &&||

左側のパイプラインの成功に基づいて、右側のパイプラインを条件付きで実行します。

# If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad
# If npm install fails, the node_modules directory is removed
npm install || Remove-Item -Recurse ./node_modules

詳細については、「 About_Pipeline_Chain_Operators」を参照してください。

Range 演算子 ..

range 演算子を使用して、連続する整数または文字の配列を表すことができます。 範囲演算子で結合された値は、範囲の開始値と終了値を定義します。

注意

PowerShell 6 で文字範囲のサポートが追加されました。

1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}

逆の順序で範囲を作成することもできます。

10..1
5..-5 | ForEach-Object {Write-Output $_}

文字の範囲を作成するには、文字を引用符で囲みます。

PS> 'a'..'f'
a
b
c
d
e
f
PS> 'F'..'A'
F
E
D
C
B
A

文字列に文字範囲を割り当てると、文字列に文字配列を割り当てるのと同じように処理されます。

PS> [string]$s = 'a'..'e'
$s
a b c d e
$a = 'a', 'b', 'c', 'd', 'e'
$a
a b c d e

配列内の文字は文字列に結合されます。 文字は、ユーザー設定変数の $OFS 値で区切られます。 詳細については、「 about_Preference_Variables」を参照してください。

配列内の文字の順序は、文字の ASCII 値によって決まります。 たとえば、 と Xc ASCII 値はそれぞれ 99 と 88 です。 その範囲は逆の順序で表示されます。

PS> 'c'..'X'
c
b
a
`
_
^
]
\
[
Z
Y
X

範囲の開始値と終了値には、整数または文字に評価される式の任意のペアを指定できます。 たとえば、列挙型のメンバーを開始値と終了値に使用できます。

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 つの値の間の値の範囲を表します。 range 演算子を使用して、列挙体のメンバーを確実に表すことはできません。

メンバー アクセス演算子 .

オブジェクトのプロパティとメソッドにアクセスします。 メンバー名には式を指定できます。

$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }

PowerShell 3.0 以降では、メンバーを持たないリスト コレクション オブジェクトで 演算子を使用すると、PowerShell はそのコレクション内の項目を自動的に列挙し、それぞれの演算子を使用します。 詳細については、「 about_Member-Access_Enumeration」を参照してください。

静的メンバー演算子 ::

.NET Framework クラスの静的プロパティとメソッドを呼び出します。 オブジェクトの静的プロパティとメソッドを検索するには、 コマンドレットの Static パラメーターを Get-Member 使用します。 メンバー名には式を指定できます。

[datetime]::Now
'MinValue', 'MaxValue' | Foreach-Object { [int]:: $_ }

三項演算子 ? <if-true> : <if-false>

単純な条件付きケースでは、 ステートメントの代わりに三項演算子を if-else 使用できます。

詳細については、「 about_If」を参照してください。

null 合体演算子 ??

null 合体演算子 ?? は、左側のオペランドが null でない場合に、左側のオペランドの値を返します。 それ以外の場合は、右側のオペランドを評価し、その結果を返します。 左側のオペランドが null 以外に評価された場合、?? 演算子は右側のオペランドを評価しません。

$x = $null
$x ?? 100
100

次の例では、右側のオペランドは評価されません。

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

null 合体代入演算子 ??=

null 合体代入演算子 ??= は、左側のオペランドが null と評価された場合にのみ、右側のオペランドの値を左側のオペランドに代入します。 ??= 演算子では、左側のオペランドが null 値以外に評価された場合は、その右側のオペランドは評価されません。

$x = $null
$x ??= 100
$x
100

次の例では、右側のオペランドは評価されません。

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020

Null 条件演算子 ?.?[]

注意

この機能は、PowerShell 7.1 で試験段階からメインストリームに移行しました。

null 条件演算子は、そのオペランドが null 以外に評価される場合にのみ、メンバー アクセス ?.、または要素アクセス ?[] 演算子をそのオペランドに適用します。それ以外の場合は、null を返します。

PowerShell では、変数名の一部として ? が許可されるため、これらの演算子を使用するには、変数名の正式な仕様が必要です。 や が変数名 の一部である場合?など${a}、変数名の周囲に中かっこ ({}) を使用する${a?}必要があります。

注意

の変数名構文 ${<name>} は、部分式演算子と $() 混同しないでください。 詳細については、「about_Variables」の変数名のセクションを参照してください。

次の例では、PropName の値が返されます。

$a = @{ PropName = 100 }
${a}?.PropName
100

次の例では、 メンバー名 PropName にアクセスせずに null を返します。

$a = $null
${a}?.PropName

この例では、インデックス付き要素の値が返されます。

$a = 1..10
${a}?[0]
1

次の例では、インデックス付き要素にアクセスせずに null を返します。

$a = $null
${a}?[0]

こちらもご覧ください