PowerShell の変数

PowerShell を使用されている方で変数を使用していない方は少ないと思いますが、PowerShell には変数として

の4種類があり、それぞれ微妙に異なる用途があります。

環境変数

環境変数は、Windows 等の OS の提供する変数で、多くの人に馴染みのある変数です。PowerShell では環境変数は Environment というプロバイダによって実装されていて、標準では env: というドライブレターでアクセスできるようになっていますが、通常は変数名の前置として使用します。

# 環境変数 HOMEDRIVE の値を表示
PS > $env:HOMEDRIVE
C:

# 環境変数 PATH の値を ";" で分割して表示
PS > $env:PATH -split ";"
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0
C:\Program Files\Consoles
C:\Program Files (x86)\Consoles

# 環境変数 PATH に C:\Program Files\Java\jdk1.7\bin を追加する
PS > $env:PATH += ";C:\Program Files\Java\jdk1.7\bin";

ドライブとして扱えることを利用して、環境変数を列挙したりすることもできます。たとえば、dir コマンドを使用して env: ドライブを参照すると、

PS > dir env:

Name                 Value
----                 -----
ComSpec              C:\Windows\system32\cmd.exe
HOMEDRIVE            C:
  :

と、環境変数の名前と設定値の一覧を得ることができます。この出力からもわかるように、環境変数は Name と Value のペアで作成されているので、

PS > dir env: | where { $_.Name -match "path") }

Name                 Value
----                 -----
CLASSPATH            ....
HOMEPATH             ....
Path                 ....
PATHEXT              ....
PSModulePath         ....

と、where コマンドを使って絞り込んだりすることもできます。

セッション変数

残りの3つの変数は、すべてセッション変数と呼ばれる変数です。これは、PowerShell のスコープ毎に作成される変数になります。環境変数と同じように Variable: ドライブとしてマップされていますが、PowerShell 自身が提供している機能であるため他のプロバイダとはやや違う動きをします。
各変数とスコープについては次回以降にして日付を稼ぐとして、軽く。

自動変数

自動変数は読み取り専用のセッション変数です。自動変数は PowerShell のコマンドの実行結果や各種状態を問い合わせる手段として利用できます。
たとえば $? という自動変数には、直前に実行されたコマンドが成功したかどうかが格納されていますし、$Error という自動変数にはコマンドの実行結果として発生したエラーが格納されています。
よく使う自動変数としては、$_, $True, $False, $NULL, $Matches あたりがあります。自動変数の一覧と解説を見たい場合には、help about_Automatic_Variables で確認することができます。*1

設定変数

設定変数は、PowerShell の動作を変更するための変数です。自動変数と非常に似ていますが、書き込み可能であるところが自動変数とは異なります。
たとえば $ErrorActionPreferece という設定変数は、コマンドからエラー出力が発生した場合に PowerShell が実行の継続をどのようにするかのデフォルト値を設定することができます。既定では Continue になっていて「エラーメッセージを表示して次に進む」という動作になっていますが、Inquire を指定すれば「エラーメッセージを表示して、次に進むかどうかをユーザに問い合わせる」になりますし、Stop を設定すれば「エラーメッセージを表示して停止する」という指定になります。
$ErrorActionPreference は、あくまでデフォルト値の設定です。ある特定のコマンドだけエラー処理を変更したい場合には、そのコマンドに対して -ErrorAction パラメータを指定することでこの変数の設定値を上書きすることができます。
設定変数の一覧と解説を見たい場合には、help about_preference_variables で確認することができます。*2

ユーザ変数

自動変数でも設定変数でもないセッション変数は、利用者が自由に作成できる変数になります。
変数名には、かなり柔軟な名前が使用できます。PowerShell の構文解釈上に問題があるような名前を使用する場合には、{ } を使って変数名の範囲を明示することができます。{ や } 自身を指定する場合には { } を使って変数名の範囲を明示した中でエスケープシーケンスを使用します。

# 変数名に記号等の文字を含めるためには { } が必要
PS > ${abc-def} = 1

# 変数名に { 自身を含めるにはエスケープ文字を使用する
PS > ${abc`{def`}ghi} = 2;

# 作成された変数を見る
PS > dir variable:

Name                 Value
----                 -----
abc-def              1
abc{def}ghi          2

# 名前の前半が同じ変数を作成する
PS > $a = 1
PS > $abc = 3

# 文字列による変数展開を行う場合、より長い名前に一致する
PS > "$ab $abc-def"
 3-def

# 変数名の範囲を明示することで、正しく変数名を認識させる
PS > "${a}b ${abc-def}"
1b 1

*1:ヘルプは部分一致検索されるので、初期状態の PowerShell であれば help about_au まで入力すれば about_Automatic_Variables だけがヒットします

*2:ヘルプは部分一致検索されるので、初期状態の PowerShell であれば help about_pre まで入力すれば about_preference_variables だけがヒットします