Powershell Windows

Powershellにおける$(ドルマーク)の意味を解説!

Powershellでよく見かける$(ドルマーク)の用法について解説していきます。

$(ドルマーク)の用法1:変数

この用法は既に認識している人が多いかもしれませんが念のため解説しておきます。Powershellでは変数の前に$(ドルマーク)を置くと、その単語が変数であることを表します。

PS C:\Users\owner> $test = "This is a test."
PS C:\Users\owner> Write-Host $test
This is a test.

変数には文字列や数字だけでなくオブジェクトを代入することもできます。オブジェクト自体は人間が読める形式ではないので出力した結果がよくわからないことになってますが、これを分かり易く表示するための方法の一つとして次の用法2を利用したりします。

PS C:\Users\owner> $test = Get-Process
PS C:\Users\owner> Write-Host $test
System.Diagnostics.Process (ApplicationFrameHost) System.Diagnostics.Process (CAMTray) System.Diagnostics.Process (CefSharp.BrowserSubprocess) System.Diagnostics.Process (chrome) System.Diagnostics.Process (chrome) Syste
…(略)…

$(ドルマーク)の用法2:パイプライン変数

多分多くの人が探している用法はこっちじゃないでしょうか。$_.(ドルアンダースコアドット)という表現を見かけるかもしれませんが、これも本質的には変数と同じです。ただ普通の変数とは異なりパイプラインという、コマンドの出力を次のコマンドの入力として使用する場面で多用されます。

どういうことかもっと具体的に見ていきましょう。例えばGet-Processコマンドレットの実行結果は以下の通りになっています。

この結果において「ProcessName」の列の値が「chrome」になっている行をパイプライン変数である「$_.(ドルアンダースコアドット)」を利用して下記のスクリプトで簡単に取り出すことができます。

//-eqは等しいことを表す比較演算子
Get-Process | Where-Object { $_.ProcessName -eq "chrome" }

Get-Processを実行した結果(オブジェクト)がパイプライン演算子( | ← この縦の棒みたいな記号)の次のコマンドであるWhere-Objectに渡されますが、その渡されたオブジェクトの省略形が$_.(ドルアンダースコアドット)のようなものだと捉えるとわかりやすいかもしれません。※厳密には違いますが理解することに重きをおくなら以下をイメージすると分かり易いでしょう。

$test = Get-Process
$test | Where-Object { $_.ProcessName -eq "chrome" } //$test変数を$_.に置き換えることができて楽!
$test | Where-Object { $test.ProcessName -eq "chrome" }

$_.の意味の補足

用法2の最後で$_.の意味はパイプラインで渡されてきたオブジェクトの省略形のようなものだと言いましたが注釈で厳密には違うと記載しています。私の説明では以下の例の「$_.ProcessName」と「$test.ProcessName」が同じ意味のような印象を受けたかもしれませんが、出力を見てもらうと分かる通り最初の例ではきちんとフィルタリングされている一方2つ目の例ではフィルタリングされてません。あまり細かいことを言い出すと頭がこんがらがるので「$_.」は変数やオブジェクトの置き換えに近いという理解で良いと思いますが、厳密には異なるということだけ頭の片隅においておいてください。

-Powershell, Windows