連載
» 2004年09月17日 00時00分 公開

Windows管理者のためのWindows Script Host入門:第6回 WshShellオブジェクトの詳細(2) (2/3)

[海津 智宏,著]

環境変数の取得と設定

 実行ファイルの検索パス、一時フォルダのパスなど、Windowsシステムやアプリケーションが利用するシステム情報のいくつかは環境変数として保存されている。WshShellオブジェクトのExpandEnvironmentStringsメソッドで環境変数の取得が、Environmentプロパティで環境変数の取得と設定が可能である。

■ExpandEnvironmentStringsメソッド

 コマンド・プロンプトなどで環境変数を利用する場合は、最初と最後に「%」を使った表記を用いて、特定の環境変数に格納されている値をバッチ・ファイルなどで利用できる。例えばWindowsディレクトリに存在するwin.iniというファイルなら、「%SystemRoot%\win.ini」のように表記する。この“SystemRoot”は、システムのWindowsフォルダのパスが保存されている環境変数で、コマンド・プロンプトやバッチで「%SystemRoot%\win.ini」と指定すると、環境変数が展開されて、「C:\Windows\win.ini」と解釈される(Windows XPやWindows Server 2003の場合)。

 こうした環境変数の文字列を得るためのメソッドがExpandEnvironmentStringsである。ExpandEnvironmentStringの処理は、コマンド・プロンプトから“SET”コマンドを実行して表示できる環境変数の値をスクリプトで取得することに近い(現在のプロセスに対応する環境変数の値を取得する。プロセス以外の環境変数については後述)。

 ExpandEnvironmentStringsメソッドを利用して環境変数を取得してみよう。

Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "SystemRoot: "
WScript.Echo "  " & objShell. ExpandEnvironmentStrings("%SystemRoot%")
WScript.Echo "Path: "
WScript.Echo "  " & objShell. ExpandEnvironmentStrings("%PATH%")
WScript.Echo "Temp: "
WScript.Echo "  " & objShell. ExpandEnvironmentStrings("%TEMP%")

ExpandEnvironmentStringsメソッドを利用するサンプル・スクリプト

 これをexpandenvironment.vbsというファイルに保存して実行すると次のようになる。

D:\WSH> cscript expandenvironment.vbs
SystemRoot:
  C:\WINDOWS
Path:
  C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32\WBEM
Temp:
  C:\DOCUME~1\tomo-k\LOCALS~1\Temp

D:\WSH>

 上記サンプル・スクリプトでは、環境変数文字列だけを展開しているが、例えば「%SystemRoot%\win.ini」のように、環境変数以外の文字を含む場合も問題なく展開できる(環境変数でない文字列はそのまま出力される)。また、環境変数を利用して別の環境変数が定義してある場合でも、自動的に最後まで展開が行われる(例えば、環境変数「TEMP」は通常「%USERPROFILE%\Local Settings\Temp」と定義されているが、「%TEMP%」を展開すれば、自動的に「%USERPROFILE%」部分の展開も行われる)。

■Environmentプロパティ

 前記ExpandEnvironmentStringsメソッドでは、現在のプロセスに関連する環境変数を取得できるだけだった。これに対しEnvironmentプロパティでは、環境変数の値を取得するだけでなく、スクリプトで任意の値を設定することができる。また現在のプロセスに関連する環境変数だけでなく、システム用の環境変数や、一時的に利用する環境変数などを取得、設定できる。

 Environmentプロパティを利用する場合には、Windows環境で利用可能な環境変数の種類に注意する必要がある。環境変数の種類には、以下に示す4種類がある。

種類 有効範囲
System すべてのユーザー
User 現在のユーザー
Volatile 現在のログオン
Process 現在のプロセス
環境変数の種類と有効範囲

 「System」はコンピュータごとの設定で、すべてのユーザーに対して適用される環境変数である。どのユーザーでログオンしてもその環境変数が適用され、内容を変更するとその結果はすべてのユーザーに適用される。

 「User」はユーザーごとの設定で、現在ログオン中のユーザーにのみ適用される。内容を変更しても、ほかのユーザーには影響しない。なおユーザーがログオフしても、再度ログオンすると以前に設定した環境変数の値が適用される。

 「Volatile」(「揮発性の」という意味)は、現在のログオン・セッションのみに適用される。名前が示すとおり、Volatile環境変数は一時的に使われるもので、ログオン中のユーザーがログオフしたり、コンピュータを再起動したりすると、変更した内容は変更前の内容に戻る。

 「Process」は、現在のプロセスにのみ適用される環境変数である。Process環境変数は、コマンド・プロンプトが終了するなど、現在のプロセスが終了すると、変更内容が元に戻る。

 このように、一時的に環境変数を設定して利用する場合は、Process やVolatileを利用して、影響が後に残らないようにする。逆に変更内容をその後も継続して保持させたければ、SystemやUserを設定すればよい。

 Environmentプロパティを利用する場合には、前述したどの種類の環境変数を利用するのかを指定しなければならない。Environmentプロパティに環境変数の種類を指定すると、その種類の環境変数の一覧が名前付きコレクションとして返される。例えば、Process環境変数を取得、設定するなら、

Set colEnv = objShell.Environment("Process")

と“Process”を指定してコレクションを取得し、colEnv.Item("TEMP")のようにして各環境変数にアクセスする。ただし、環境変数の種類によって、利用できる環境変数が一部異なるので注意が必要だ。Process環境変数は、すべての変数が使えるのだが、それ以外のSystem、User、Volatile環境変数は、その中の一部だけが利用できる。Windows 2000/XP/2003における標準的な環境では、次の表に挙げる変数が利用可能である。登録されていない変数を設定した場合には、新しく変数が作成され、登録されていない変数を読み込んだ場合には空文字列が返される。

変数 System User Volatile Process
NUMBER_OF_PROCESSORS × ×
PROCESSOR_ARCHITECTURE × ×
PROCESSOR_IDENTIFIER × ×
PROCESSOR_LEVEL × ×
PROCESSOR_REVISION × ×
OS × ×
COMSPEC × ×
HOMEDRIVE × ×
HOMEPATH × ×
PATH × ×
PATHEXT × ×
PROMPT × × ×
SYSTEMDRIVE × × ×
SYSTEMROOT × × ×
WINDIR × ×
TEMP × ×
TMP × ×
環境変数の種類と利用できる変数(○=利用可、×=利用不可)

 これらのうち、SystemとUserに関しては、システムのプロパティからも確認できる([マイ コンピュータ]を右クリックして表示される[システムのプロパティ]ダイアログで[詳細]タブ−[環境変数]ボタンをクリック)。

システムのプロパティで環境変数を表示したところ
SystemとUser環境変数はこのダイアログで確認できる。同じ環境変数が両方で定義されていることもある。
 (1)現在ログオンしているユーザーのUser環境変数一覧。
 (2)このコンピュータのSystem環境変数一覧。

 Environmentプロパティが返すコレクションはWshEnvironmentクラスのオブジェクトであり、次の4種類のメソッド、プロパティが利用できる。

メソッド/プロパティ 内容
Itemプロパティ 変数名を表す文字列をパラメータとし、その値を取得・設定する
Countメソッド 環境変数の個数を取得する(主にVBScript向け)
lengthプロパティ 環境変数の個数を取得する(主にJScript向け)
Removeメソッド 変数名を表す文字列をパラメータとし、その環境変数を削除する

 次のコードは、Environmentプロパティを使った簡単な例である(ファイル名はenvironment.vbsとした)。

1: Set objShell = WScript.CreateObject("WScript.Shell")
2: Set colEnv = objShell.Environment("User")
3:
4: WScript.Echo objShell.ExpandEnvironmentStrings("%TEMP%")
5: WScript.Echo colEnv.Item("TEMP")
6:
7: colEnv.Item("NewVar") = "NewValue"
8: WScript.Echo colEnv.Item("NewVar")
9: colEnv.Remove("NewVar")

 実行すると次のようになる。

D:\WSH> cscript environment.vbs
C:\DOCUME~1\tomo-k\LOCALS~1\Temp
%USERPROFILE%\Local Settings\Temp
NewValue

D:\WSH>

 このスクリプトでは、2行目でUser環境変数のコレクションを取得し、続く4行目と5行目で、同じTEMP環境変数に対して、2つの方法を比較している。

 結果から分かるとおり、ExpandEnvironmentStringsメソッドを使って環境変数を取得した場合は、完全に展開されたパスが表示され、Environmentプロパティを使った場合は%USERPROFILE%という別の環境変数の部分がそのまま表示されていることが分かる。

 7行目では、新しい「NewVar」環境変数を作成して文字列“NewValue”を設定し、8行目で作成した環境変数を表示し、9行目で作成した環境変数を削除している。9行目を削除してスクリプトを実行すれば、実行後にシステムのプロパティを確認することで、新しいNewVarという環境変数が設定されていることを確認できる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。