PowerShell における「変数」について調べてみました。
PowerShell にはデフォルトでもいくつかの変数が存在します。PowerShell のバージョンを確認出来る "$psversiontable" は、やったことのある方も多いのではないでしょうか。(Windows Server 2008 R2 に標準搭載されている PowerShell V2.0 以降にしか存在しない変数ですが。)
コマンドプロンプトでも、「%」で前後を括る事により、「環境変数」を使うことが出来ました。例えば、現在ログオンしているユーザー名を表示するためには、"%username%" を実行します。(結果として表示されるユーザー名がコマンドとして実行されてしまうことを回避するには、"echo %username%" を実行します。)
ではPowerShell で"$username" を実行するとどうなるかというと、なにも起こりません。PowerShell においては、「$psversiontable」 のような「変数」と、従来の「環境変数」とは別物のようです。
調べた結果、PowerShell で「現在ログオンしているユーザー名」を表示するためには、"$env:username" を実行すればよいことが分かりました。
この「env:」とやらは一体なにものでしょうか? 実はこれ、「PSドライブ」の一種なのです。(調べれば調べるほど、次から次へと新しい用語が出てくるので参ります。。。)
「PSドライブ」はPowerShell 独特の概念のようです。PowerShell だけが扱える仮想的なファイルシステムのようなもの、と言えるかもしれません。
従来のコマンドプロンプトでは、Cドライブ等のファイルシステムのディレクトリの中を見るには「dir」コマンドを用いましたが、同じような階層構造を持つレジストリの場合、別途「reg query」コマンドを用いる必要がありました。Powershell の場合はどちらも「PSドライブ」として扱えるので、「get-childitem」という共通のコマンドレットで両方の中を見る事が出来ます。
PSドライブの一覧を確認するには、"get-psdrive” を実行します。すると、マウントされているドライブやレジストリ(HKCU、HKLM)の他に、「Env」もあることが分かります。
「Env」がPSドライブであるならば、同じくPSドライブであるCドライブの中身を見る時と同じように、"get-childitem" コマンドレットでその中身を見る事が出来るはずです。そこで"get-childitem env:" を実行してみたところ、「環境変数」の一覧を取得することができました。もちろんその中には「USERNAME」もあります。
"$env:username" の意味は、「PSドライブ『Env』配下にある環境変数『USERNAME』に格納されている値を、『変数』として呼び出す」というものだったようです。
なお、「$」を先頭に付与する事で、PSドライブ配下の「変数ではないもの」を、変数のように扱う事が出来ます。
たとえば、"${C:¥1.txt}" を実行する事で、Cドライブ直下の「1.txt」というテキストファイルの中身を表示出来ます。(パス全体を{}で括る必要があるのは、おそらく「¥」が特殊記号だからでしょう。)
では、PSドライブを明示する必要が無い、「$psversiontable」のような「純粋な変数」の情報は、一体どこに存在するのでしょうか。
調べたところ、PSドライブ「Variable」の中にありました。このPSドライブの中にある「変数」は、変数名の先頭に「$」を付けるだけで(variable: は記述せずとも)呼び出す事が可能です。Variable 配下の変数の一覧は、"get-variable" ないし "get-childitem variable:" を実行することで確認出来ます。