環境変数


ここでは、PowerShellで環境変数を扱う方法について解説します。

まず環境変数というものについて、簡単に説明します。
環境変数とは、様々なアプリケーションで使用する値をPC上に設定したものです。
良く使用されるのはディレクトリやファイルへのパス情報などを登録することが多いと思います。
プログラミングの書籍などを読んだり調べたりすると、よく初めに環境変数を設定する手順が
あります。例えば、Javaなどのプログラムを作成する場合の手順であれば、
「JAVA_HOME」という環境変数を設定したり、「PATH」という環境変数にJavaを
インストールしたディレクトリまでのパスを追加する手順などです。
こうして設定した環境変数をアプリケーションから参照することで、必要なプログラムが
あるパスなどをアプリケーションが知ることができるという訳です。
通常はGUI操作でシステムのプロパティを開き、環境変数の設定を行います。

さて、それではこの環境変数をPowerShellで扱う方法について説明します。
まず、知っておいて貰いたいのはPowerShellでは環境変数はPSドライブで管理されている
ということです。PSドライブについては、PSドライブの項目で説明していますので、
そちらを参照してください。
それでは、まず環境変数の一覧を見てみましょう。
以下のようにPowerShellで入力してみてください。


PS>Push-Location Env:
PS>Get-ChildItem


これで現在PCに設定されている環境変数が表示されます。
これは環境変数を管理しているPSドライブに移動し、その一覧を取得しているだけです。
元のドライブに戻る場合はPop-Locationコマンドレットを使用してください。
このあたりの操作はPSドライブのところで説明しています。

さて、それでは環境変数の値を取得する方法です。
やり方はPSドライブのところでも説明しましたが、環境変数の値を取得する方法は以下のように
します。

$Env:環境変数名

たったこれだけです。因みに大文字小文字の区別はありませんので、「$env」でも構いません。
ではWindowsがインストールされているディレクトリまでのパスを表す環境変数「SystemRoot」を
取得してみます。


PS>$env:SystemRoot
C:\WINDOWS


たったこれだけです。因みに、「$env:」まで入力してある程度入力した後にタブキーを押すと
入力補完してくれます。つまり、環境変数名を丸覚えする必要はありません。
SystemRootであれば「$evn:s」ぐらい押してタブキーを押していれば直ぐに見つけることが
出来るでしょう。
こうして環境変数の値を取得することができれば、あらかじめ環境変数として設定したディレクトリに
対して処理をすることも簡単でしょう。
パスを設定している環境変数であれば普通の変数のように使用することは可能です。
例えば、環境変数で設定されているディレクトリにテキストを出力したい場合は以下のようにすれば
良いだけです。


PS>#環境変数ABCに設定されたディレクトリにファイルを出力する
PS>Set-Content -Path "${env:ABC}\test.txt" -Value "あいうえお";
PS>
PS>#ファイルの確認
PS>Get-Content -Path "${env:ABC}\test.txt";
あいうえお
PS>


Set-Contentコマンドレットにより環境変数を使用してファイルに書き込み、
Get-Contentコマンドレットによりそのファイルの中身を確認しています。
このようにして環境変数を使用することになります。

さて、環境変数を取得することができましたが、続いて設定する方法について説明します。
環境変数を設定するのは難しくはありません。
以下のようにすれば良いだけです。


PS>#環境変数TESTの設定
PS>$env:TEST="テスト用だよ";
PS>
PS>#環境変数TESTが設定されていることを確認
PS>$env:TEST;
テスト用だよ
PS>
PS>#環境変数TESTに追記
PS>$env:TEST+=" 追記テスト";
PS>
PS>#環境変数TESTに追記されていることを確認
PS>$env:TEST;
テスト用だよ 追記テスト
PS>
PS>#環境変数TESTの内容を上書き
PS>$env:TEST="上書きテスト";
PS>
PS>#環境変数TESTが上書きされていることを確認
PS>$env:TEST;
上書きテスト
PS>


さて、一通りの操作を書いてみましたが、通常は環境変数を設定する場合は

$Env:設定する環境変数名 = 設定値

で大丈夫です。上のサンプルでも分かるように「$env:設定した環境変数名」で、正常に
値を取得できていることが分かると思います。追記する場合や上書きする場合の例も載せて
いますが、環境変数は普通のString型であるため文字列を編集する場合と大差ありません。
Stringのメソッドを呼ぶこともできます。

さて、環境変数を設定する方法が分かりました。
これが分かれば会社などであらかじめ使用する環境変数を設定するようにスクリプトを
作っていれば、新しい人が増えた時などにそのスクリプトを流すだけで済むので便利ですね。
・・・という訳にはいきません。
実は上の方法で設定した環境変数はその起動したPowerShell上でしか有効ではありません。
つまり、次にPowerShellを起動したときには設定されていませんし、
「システムのプロパティ」などで見てもこの方法で設定した環境変数は表示されません。
それではあまりに意味がないですね。
きちんと消えずに設定する方法はあります。
残念ながらコマンドレットで設定する方法はありませんが、Environmentクラスのメソッドを
使用することで設定可能です。
Add-Typeコマンドレットで型を追加したり、New-Objectコマンドレットでインスタンスを
生成したりする必要はありませんので、多少の手間は我慢しましょう。

では、環境変数を消えずに設定するには、.NetのEnvironmentクラスのSetEnvironmentVariableメソッドを
使用します。以下のように使用します。

[System.Environment]::SetEnvironmentVariable("環境変数名", "環境変数値", 種類)

この時、の種類というのはEnvironmentVariableTarget列挙体の値になります。
EnvironmentVariableTarget列挙体の値は以下の3つが用意されています。

・Machine : システム環境変数を設定する場合に使用します。
・User : ユーザ環境変数を設定する場合に使用します。
・Process : そのプロセス内でのみ使用する場合に使用します。($Env:環境変数名で設定する場合と同じ)

消されずに残しておきたい場合は「Machine」か「User」を3番目の引数に使用すれば良い訳です。
以下にサンプルを載せます。


PS>#システム環境変数の設定
PS>[System.Environment]::SetEnvironmentVariable(`
>>     "TEST1",`
>>     "あいうえお",`
>>     [System.EnvironmentVariableTarget]::Machine`
>> );
>>
PS>#ユーザ環境変数の設定
PS>[System.Environment]::SetEnvironmentVariable(`
>>     "TEST2",`
>>     "かきくけこ",`
>>     [System.EnvironmentVariableTarget]::User`
>> );
>>
PS>
PS>#システム環境変数にTEST1が登録されていることを確認
PS>[System.Environment]::GetEnvironmentVariable(`
>>     "TEST1",`
>>     [System.EnvironmentVariableTarget]::Machine`
>> );
>>
あいうえお
PS>#ユーザ環境変数にTEST2が登録されていることを確認
PS>[System.Environment]::GetEnvironmentVariable(`
>>     "TEST2",`
>>     [System.EnvironmentVariableTarget]::User`
>> );
>>
かきくけこ


さて、上のサンプルではシステム環境変数とユーザ環境変数を設定して、正常に設定されたか
を確認しています。Environmentクラスでは、環境変数を扱うためのメソッドは色々あるので、
環境変数を取得することも可能です。上の例ではシステム環境変数として登録されているか、
あるいは、ユーザ環境変数として登録されているかを確認するため、GetEnvironmentVariableメソッドを
使用しています。Environmentクラスについてもっと知りたい方はMSDN等で参照してみると
良いと思います。
補足ですが、このEnvironmentクラスを使用してMachine、Userで設定した環境変数はそのPowerShellの
プロセスでは直ぐに使用できません。(Processで設定したものは使用できます。)
それは、システム環境変数やユーザ環境変数はプロセスが生成された際に、そのプロセスにコピーされるものだからです。
再起動した際には使えるようにはなっていますが、直ぐ使おうとしても使えないということは認識しておいてください。

さて、それでは環境変数については以上です。