適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

PowerShellの自動変数研究_$$

この記事では

  • PowerShellの自動変数について研究するシリーズの第1弾です。
  • PowerShellの自動変数のひとつ「$$」について使い方などを考察しています。

はじめに

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

私も日々勉強中です。このシリーズでは実験形式で、その実態に迫っていければと思います。

今回の実験対象は「$$」という自動変数です。

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

初見だと、「こんな見た目ありか?」的な見た目ですね。
PowerShellの場合、変数の接頭辞が$のためドル記号が二つ続く形になってしまい、ひときわクレイジーな見た目になっております。

どんな値が格納される変数なのか?
PowerShellのabout_Automatic_Variablesを引用してみます。

セッションが受け取った最後の行にある最後のトークンを格納します。 https://forsenergy.com/ja-jp/windowspowershellhelp/html/622a7dda-b90f-44d8-9f69-d7b50d40130a.htm#

実際はどんなものが格納されるのか

「最後のトークン」が格納されているらしい・・・。最後のトークンってなんだよ!
よくわからないので、どんなものが実際に格納されているのか確認してみることにします。

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

試しに「Hello」という文字をコマンドに入力してみます。

するとコンソールに「Hello」と表示されます。

その状態で$$を入力すると、「Hello」が格納されているらしいことがわかります。

これが最後のトークンということでしょうかね。

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

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

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

ここで「トークン」という言葉についてWikipediaを引用してみます。

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

最小単位ということですね。 セッションが受け取った最後の行にある最後の「最小単位」を格納します。 ということですね。

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

もう少し見てみましょう。

配列の場合どうなるのか、見てみます。

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

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


PS C:\> $$
]

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

結果は「]」です。

私、字句解析とかよくわからないのですが、配列を解析すると、最後のトークンは閉じカッコ的なものになるんですね。

もう少し実験

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がどのように字句解析をしているかの片鱗が見えるということでしょうかね。

浅学の私には、これを実践で使う場面が想像できませんでした・・・。

どのように使えるか、わかる方がいれば教えて頂ければと思います・・・。

でも色々見てると面白い変数だなぁと思います。

ここまでお読みいただき、ありがとうございました。