Windowsでシステムのデフォルトの環境変数を設定しておくと、新しいプロセスが起動されるたびに、その環境変数が引き継がれる。環境変数を設定するには、システムのプロパティを使うか、setxコマンドを使うとよい。setxでの設定後は、新しくプロセスを起動しないと、その環境変数の値は反映されない。
対象OS:Windows XP/Windows Vista/Windows 7/Windows 8/Windows 8.1/Windows 10/Windows Server 2003/Windows Server 2008/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2
バッチファイルなどで環境変数の値を設定する場合、通常は「SET」という、コマンドプロンプトの内部コマンドを利用する。だがこのSETコマンドで設定した変数の値は、そのコマンドプロンプト内(およびそこから起動したプロセス)でのみ有効であり、別のプロセスやユーザーからは参照できないし、変更することもできない。
これに対し、システムのプロパティ(エクスプローラーで[マイコンピューター]あるいは[PC]を右クリックしてポップアップメニューから[プロパティ]を選択すると表示されるダイアログ)の[詳細設定]タブにある[環境変数]ボタンを使って「システム環境変数」の値を設定すると、システム全体のデフォルトの環境変数として利用できる。
また「ユーザー環境変数」の値を設定すると、ユーザーごとに固有のデフォルト環境変数(ユーザーがログオンしたときに参照できる環境変数)として利用できる。これらで設定された環境変数の値は(例:PATHやTEMPなど)、ログオン後にコマンドプロンプトを開いて、単にSETと入力すると表示され、確認できる。
TIPS「環境変数を変更する」では、これらのデフォルトの環境変数を設定/変更する方法について解説した。だがいちいちGUIの画面を開いて設定するのでは、自動化も困難である。またTIPS「WSHで環境変数を設定する」で紹介した方法もあるが、こちらはWSHが必要である。
だがsetx.exeというコマンドを利用すると、これらの環境変数の値を、setコマンドのように簡単に設定/変更できる。本TIPSでは、setxの基本的な使い方について紹介する。
setxコマンドは、Windows OSシステムの環境変数(システム環境変数とユーザー環境変数の2種類があるが、以下まとめて単に環境変数と呼ぶ)を設定するためのコマンドである。ユーザーログオン時にあらかじめ環境変数を設定しておくことにより、例えばバックアップや定型処理などで次のようなことができるようになる。
さらにsetコマンドと違い、リモートのコンピューターの環境変数を設定したり、テキストファイルやレジストリから文字列を読み出して環境変数に設定したり、といった使い方もできる。
なおsetx.exeというコマンドは、Windows XPではサポートツールに含まれているので、まずサポートツールをインストールする必要がある(CD-ROMの\SupportフォルダにあるSUPTOOLS.MSIをインストールする)。それ以外のWindows OSではシステムに標準で用意されているので、事前の作業は不要である。
引数なしで「setx」を実行するか「setx -?(もしくはsetx /?)」とすると、ヘルプが表示される。Windows XPのsetxの場合は、「setx -i」とすると、より詳しい説明が表示される。
このコマンドは標準のsetコマンドの書式(「set <環境変数名>=<値>」とする)と違い、次のように、「=」記号なしで環境変数名とその値を並べて使用する。ちなみにこの形式は、UNIXやLinuxのcshなどにおけるsetenvコマンドの書式に近い。
setx <環境変数名> <値>
上のコマンドを実行すると、指定されたユーザー環境変数に値がセットされる(空白などを含む値文字列の場合は、" " 記号で囲むこと)。
システム環境変数をセットしたい場合は、次のように、末尾に「-m」オプションを付けて実行する。これを先頭に付けると、「-m」が変数名とみなされるので注意すること。
setx <環境変数名> <値> -m
またシステム環境変数を追加/修正/削除するには、管理者権限でsetxを実行する必要がある。コマンドプロンプトを管理者権限で起動する方法は、右上の関連記事を参照していただきたい。
setxコマンドで設定した値は、システムのプロパティにあるユーザー環境変数かシステム環境変数に反映される。だがここで設定された値は、新たにコマンドプロンプトやプロセスを起動した場合にのみ反映されるので注意していただきたい。
つまりコマンドプロンプトを開いてsetxで環境変数を設定しても、そのコマンドプロンプト内では、設定した値は参照できないのである(このあたりは前述のsetenvと異なる)。別に新しくコマンドプロンプトを開いて、初めてその値が参照できる。
コマンドプロンプト内から子プロセスとしてcmdを起動しても、参照はできない。必ず、別プロセスとして起動しなければならない。
C:\>setx MYVAR "foo bar" ……MYVARをセットしてみる
成功: 指定した値は保存されました。
C:\>set myvar ……変数MYVARを表示させてみる
環境変数 myvar が定義されていません ……未定義。設定されていない
■新しく別に起動したコマンドプロンプト上での操作
C:\>echo %myvar% ……変数MYVARを表示させてみる
foo bar ……結果。正しく参照できた
このような事情があるため、設定した値を利用する場合は注意が必要である。例えばsetxを含むバッチコマンドをログオンスクリプトや[スタートアップ]メニューに登録したり、[タスク]で[ログオン時に実行]したりするように設定しておく。こうしておけば、ユーザーがログオンした後に起動されるコマンドプロンプトやバッチファイルでは環境変数が利用できる。
ローカルのコンピューターではなく、リモートコンピューターの環境変数を設定するには、「/s <コンピューター名>」および必要なら「/u <ユーザー名>」「/p <パスワード>」を指定する。ただしこの機能はWindows XP向けのsetxコマンドでは利用できない(ヘルプに/sオプションの説明がないsetxでは利用できない)。
C:\>setx /s mypc01 MYVAR "hello" -m ……リモートコンピューターのシステム環境変数を設定する
成功: 指定した値は保存されました。
setxコマンドで作成/設定した環境変数を削除するには、値として空文字列を指定して実行する。
C:\>setx MYVAR "" ……ユーザー環境変数の場合
成功: 指定した値は保存されました。
C:\>setx MYVAR "" -m ……システム環境変数の場合
成功: 指定した値は保存されました。
こうやって環境変数を設定しても、実際にシステムのプロパティで確認すると、値が空になるが、変数名そのものは残っている。値が空の環境変数は、プロセス(コマンドプロンプトなど)には渡されないようなので、結果として、削除したのと同等になる。気になるようならば、システムのプロパティで環境変数の定義そのものも削除しておくとよいだろう。
setxコマンドでは、レジストリから指定された値を取り出して、環境変数にセットする機能がある。このためには、「setx <環境変数名> -k <レジストリパス>」とする。<レジストリパス>は、「<レジストリキー名>\<レジストリの値の名前>」という形式で記述する。
C:\>setx buildnumber -k "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber"
抽出した値: "10240". ……「10240」が取り出した値
成功: 指定した値は保存されました。
本TIPSでは、setxコマンドの基本的な使い方について解説した。テキストファイルから文字列を取り出して設定する方法については、TIPS「テキスト・ファイル中の文字列を環境変数にセットする(setx応用編)」を参照していただきたい。
■更新履歴
【2015/07/24】Windows 10など最新のWindows環境に対応しました。
【2008/03/28】初版公開。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.