適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

PowerShellの自動変数研究_$$

この記事では

  • PowerShellの自動変数のひとつ「$$」について使い方などを考察しています。

はじめに

PowerShellには多くの自動変数があります。

自動変数とは、PowerShellの起動時や、処理をした後に、知らず知らずのうちに特定のオブジェクトが設定されている変数です。

ユーザーの伺い知らぬところで勝手に変数が設定されているため、知らないとなかなか使いこなすことができません。

逆に言えば知っていれば、意外と役に立つ変数があったりします。

そんな自動変数の中で、今回は「$$」という自動変数について個人的な考察をしてみたいと思います。

$$の詳細を確認してみる

初見だと、「こんな見た目ありか?」的な見た目ですね。

PowerShellの場合、変数の接頭辞が$のためドル記号が二つ続く形になってしまい、ひときわ不思議な見た目になっています。

公式ドキュメント(自動変数について - PowerShell | Microsoft Docs)によれば

セッションによって受信された最後の行の最後のトークンを格納します。

とだけ、書かれています。

どんなものがオブジェクトが格納されるのか

「最後のトークン」が格納されているらしいのですが、この最後のトークンというのがいまいちわかりづらいですね。

どんなものが格納されるのか、PowerShellを使って確認してみます。

例として「Hello」という文字列を入力し、その後、$$にどんなものが入っているのか、確認してみます。

PS C:\> "Hello"
Hello
PS C:\> $$
Hello

$$には「Hello」が入ったようです。

では次に足し算をやってみると・・・?

PS C:\> 2+1
3
PS C:\> $$
1

1が格納されているようです。

さて、ではさきほど出てきた「トークン」という言葉についてWikipediaを引用してみます。

プログラミング言語など(における広義の構文解析)で「トークン」と呼ばれるもの(中略)は、ソースコード中の文字の並び中の、1個ないし複数個の文字から成る文字列で、キーワードや識別子や演算子やリテラルとして意味を成す最小単位となっているもの、である。

最小単位がトークンということになります。

つまり、$$に格納されるのは、セッションが受け取った最後の行にある最後の「最小単位」になるわけですね。

先程の2+1の場合、解析されて「2」「+」「1」に分解されるので、その最後の「1」が格納されたということでしょうかね。

もう少し別の例を見てみましょう。

では配列の場合はどうなるのでしょうか。

Get-Commandで返されたコマンド一覧の配列の最初の要素にアクセスしてみます。

PS C:\> (Get-Command)[0]

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Add-ProvisionedAppxPackage                         3.0        Dism


PS C:\> $$
]

$$に格納されたのはは「]」です。

字句解析された配列の最後のトークンは閉じカッコになることがわかりました。

最後にもう1つだけ例を見てみます。

PS C:\> "Hello".Length
5
PS C:\> $$
Length

今度はメソッドを実行した後の結果を確認してみました。

この場合はLengthになることが確認できました。

やはり、解析された最後のトークン(構成単位)が格納されることがわかりました。

しかし、この$$、一体どのように使えるのでしょうか。

教えてツヨツヨの人。

使い道を考えてみる

なかば無理やりですが、$$の使い方を考えてみました。

PS C:\> Get-ChildItem


ディレクトリ: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/08/21      8:37                Drivers
・・・(省略)・・・

PS C:\> $$
Get-ChildItem

PS C:\> & $$


ディレクトリ: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/08/21      8:37                Drivers
・・・(省略)・・・

$$にコマンドレッドが格納されているのがわかっている場合、頭に実行演算子の「&」を付けると、そのコマンドを実行することができます。

色々考えてみましたが、苦し紛れに考えついたのがこの程度・・・。

私の手には負えない自動変数のようです。

今のところ、この$$の有用な使い道が全くわかりません・・・。

教えてツヨツヨの人。

終わりに

結局、使いみちがよくわからない$$でしたが、分かったのは、PowerShellがどのように字句解析をしているかという片鱗が見えておもしろ~いということでした。

全く締まらない結論で、すいません。

しかし、本当にどうやって使えばいいんだ・・・

教えてツヨツヨの人

まったく締まっていませんが、ここまでお読みいただき、ありがとうございました。