次の方法で共有


about_Operators

Short description

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

Long description

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

Arithmetic Operators

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

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

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

For more information, see about_Arithmetic_Operators.

Assignment Operators

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

For more information, see about_Assignment_Operators.

Comparison Operators

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

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

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

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

For more information, see about_Comparison_Operators.

Logical Operators

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

For more information, see about_Logical_Operators.

Redirection Operators

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

For more information, see about_Redirection

分割演算子と結合演算子

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

For more information, see about_Split and about_Join.

Type Operators

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

For more information, see about_Type_Operators.

Unary Operators

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

For more information, see about_Arithmetic_Operators.

Special Operators

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

グループ化演算子 ( )

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

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

結果式のグループ化

(...) allows you to let output from a command participate in an expression. For example:

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

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

When used as the first segment of a pipeline, wrapping a command or expression in parentheses invariably causes enumeration of the expression result. If the parentheses wrap a command, it's run to completion with all output collected in memory before the results are sent through the pipeline.

パイプ処理の前に式をグループ化することで、後続のオブジェクトごとの処理が、コマンドが出力の生成に使用する列挙に干渉することができなくなります。

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

グループ化されていない代入ステートメントは値を出力しません。 When grouping an assignment statement, the value of the assigned variable is passed through and can be used in larger expressions. For example:

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 と見なされます。 If one or more FileInfo objects are assigned to $textFiles, the conditional evaluates to $true. $textFiles ステートメントの本文でifの値を操作できます。

Note

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

Subexpression 演算子 $( )

1 つ以上のステートメントの結果を返します。 For a single result, returns a 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

ハッシュ テーブルのリテラル構文 @{}

配列部分式と同様に、この構文を使用してハッシュ テーブルを宣言します。 For more information, see about_Hash_Tables.

呼び出し演算子 &

コマンド、スクリプト、またはスクリプト ブロックを実行します。 The call operator, also known as the invocation operator, lets you run commands that are stored in variables and represented by strings or script blocks. 呼び出し演算子は子スコープで実行されます。 For more about scopes, see about_Scopes. これを使用して、必要なコマンド、パラメーター、および引数を含む文字列を作成し、コマンドのように文字列を呼び出すことができます。 作成する文字列は、コマンド ラインで入力したコマンドと同じ解析規則に従う必要があります。 For more information, see 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.

The Invoke-Expression cmdlet can execute code that causes parsing errors when using the call operator.

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

スクリプトは、そのファイル名を使用して実行できます。 スクリプト ファイルを実行可能にするには、 .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!

For more about script blocks, see about_Script_Blocks.

Background 演算子 &

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

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

Get-Process -Name pwsh &

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

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

Start-Jobと同様に、&バックグラウンド演算子はJob オブジェクトを返します。 このオブジェクトは、Receive-Jobを使用してジョブを開始した場合と同様に、Remove-JobStart-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 &

For more information on PowerShell jobs, see about_Jobs.

キャスト演算子 [ ]

オブジェクトを指定した型に変換または制限します。 オブジェクトを変換できない場合、PowerShell によってエラーが生成されます。

[datetime] '2/20/88' - [datetime] '1/20/88' -eq [timespan] '31'

A cast can also be performed when a variable is assigned to using cast notation.

コンマ演算子 ,

二項演算子として、コンマは配列を作成するか、作成される配列に追加します。 式モードでは、単項演算子として、コンマは 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 複合書式設定機能へのアクセスを提供します。 A composite format string consists of fixed text intermixed with indexed placeholders, called format items. この書式指定項目は、リスト内のオブジェクトに対応します。

各書式指定項目は、次の形式を使用し、次のコンポーネントで構成されます。

{index[,alignment][:formatString]}

対になった中かっこ ({}) が必要です。

書式設定操作によって生成される結果の文字列は、元の固定テキストに文字列で表されたリスト内のオブジェクトが混合されて構成されます。 For more information, see Composite Formatting.

演算子の左側に複合書式指定文字列を入力し、演算子の右側に書式設定するオブジェクトを入力します。

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

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

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

# 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

For more information, see About_Pipeline_Chain_Operators.

範囲演算子 ..

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

Note

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

Number ranges

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

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

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

範囲の開始値と終了値には、整数または文字に評価される任意の式のペアを指定できます。 範囲のエンドポイントは、符号付き 32 ビット整数 ([int32]) に変換できる必要があります。 値を大きくすると、エラーが発生します。 また、範囲が配列にキャプチャされる場合、結果の配列のサイズは [int]::MaxValue - 56に制限されます。 これは、.NET の配列の最大サイズです。

たとえば、列挙型のメンバーを開始値と終了値に使用できます。

PS> enum Food {
      Apple
      Banana = 3
      Kiwi = 10
    }
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10

Important

結果の範囲は、列挙型の値に限定されません。 代わりに、指定された 2 つの値の間の値の範囲を表します。 範囲演算子を使用して、列挙体のメンバーを確実に表すことはできません。

Character ranges

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

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 ユーザー設定変数の値で区切られます。 For more information, see about_Preference_Variables.

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

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

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

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

$myProcess.PeakWorkingSet
(Get-Process powershell).Kill()
'OS', 'Platform' | ForEach-Object { $PSVersionTable. $_ }

PowerShell 3.0 以降では、メンバーを持たないリスト コレクション オブジェクトで演算子を使用すると、PowerShell はそのコレクション内の項目を自動的に列挙し、それぞれの演算子を使用します。 For more information, see about_Member-Access_Enumeration.

静的メンバー演算子 ::

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

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

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

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

For more information, see 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()
$todaysDate
1/10/2020

null 条件演算子 ?. および ?[]

Note

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

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

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

Note

${<name>}の変数名構文は、$()部分式演算子と混同しないでください。 For more information, see Variable name section of about_Variables.

In the following example, the value of PropName is returned.

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

The following example returns null without trying to access the member name PropName.

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

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

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

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

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

See also