Windowsの環境変数を設定するコマンドツールにsetxがあるという話。
setコマンド
setコマンドで環境変数を設定できる。ただしこのコマンドを実行したコンソール内でのみ有効。
永続的に環境変数を変更することはできない。
setxコマンド
setx
というコマンドを使えば、コンソールから環境変数を設定できるらしい。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q109064185
http://stackoverflow.com/questions/17802788/will-setx-command-work-in-windows-xp
ところが、WindowsXPには存在しない。
setコマンドならあるが、環境変数を永続的に設定することはできない。 あくまでそのバッチファイルが終了するまでの間だけ変数を設定できるものである。
setxは別途インストールが必要だった。
ServicePack2 サポートツール
ダウンロード
http://www.microsoft.com/ja-jp/download/details.aspx?id=18546
ServicePack2サポートツールは全80件。
展開
7zなどの圧縮・解凍アプリで開いて、setxだけ取得したほうがいいかも?
- ダウンロードした
WindowsXP-KB838079-SupportTools-ENU.exe
ファイルを7zなどのツールで開く support.cab
ファイルを展開
する
support.cab
ファイルを7zなどのツールで開く
setx.exe
など欲しいファイルを展開
する
配置
- コンソールを起動する
- setx.exeを展開したパスへカレントディレクトを移動させる
または、コマンド実行時にsetx.exeのフルパスを指定する。
なお、setx.exeが存在するディレクトリを環境変数のPathに追記すれば、カレントディレクトリがどこでもsetx
と打てば使えるようになる。
動作確認
setx
>setx
SETX: This program is used to set values in the environment
of the machine or currently logged on user using one of three modes.
1) Command Line Mode: setx variable value [-m]
Optional Switches:
-m Set value in the Machine environment. Default is User.
2) Registry Mode: setx variable -k hive\key\...\value
Optional Switches:
-m Set value in the Machine environment. Default is User.
3) File Mode: setx variable -f file {-a x,y | -r x,y "string"} [-d d] [-x] [-m]
Required Switches:
-f file : Specify file name to use.
-a x,y : Specify absolute coordinates and offset.
-r x,y "string" : Specify coordinates and offset relative to string.
Optional Switches
-d ,:\ etc. : Specify additional delimiters.
-x : Displays file coordinates. Switches -a -r -e ignored!!
-m : Set value in the Machine environment. Default is User.
For more information and example use: SETX -i
どうやら環境変数だけでなく、レジストリやファイルも読み書きできるっぽい。
setx -i
最後にFor more information and example use: SETX -i
とあったので、早速setx -i
コマンドを実行してみた。
>setx -i
SETX Examples:
--------------
To view the examples screen best set the width of your command window to 100.
For the file type examples you must first create the file that you wish to
parse by using "command > filename" ie ipconfig > ipconfig.out.
IMPORTANT: SETX writes variables to the master environment in the registry.
Variables set using SETX are only available in future command windows and not
in the current command window.
SETX Command Line Examples:
--------------------------
SETX MACHINE COMPAQ
Sets value of MACHINE to be COMPAQ in the users environment.
SETX MACHINE "COMPAQ COMPUTER" -m
Sets value of MACHINE to be "COMPAQ COMPUTER" in the machine environment.
SETX MYPATH %PATH%
Sets the value of MYPATH to the CURRENT value of the PATH environment variable.
SETX MYPATH ~PATH~
Sets the value of MYPATH to ALWAYS be equal to the value of the PATH environment
variable even in the event that the PATH variable changes.
SETX Registry Examples:
-------------------
SETX TZONE -k HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInform
ation\StandardName
Sets the value of TZONE to the above key ie. "Central Standard Time"
SETX BUILD -k "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\C
urrentBuildNumber"
Sets the value of BUILD to the current Windows NT build ie. "1314"
Note: Quotes must be used because of the embedded space in "Windows NT".
SETX File Examples:
-------------------
SETX VAR -f ipconfig.out -x
Displays the coordinates for the contents of the file "ipconfig.out".
SETX IPADDR -f ipconfig.out -a 5,11
Finds value at absolute offset 5,11 of the file ipconfig.out
Sets IPADDR to the IP Address (absolute offset 5,11)
SETX OCTET1 -f ipconfig.out -a 5,3 -d .
Finds value at absolute offset 5,3 and uses "." as an additional delimiter.
Sets OCTET1 to the first octet of the IP Address
SETX IPGATEWAY -f ipconfig.out -r 0,7 "Gateway"
Finds value at relative offset 0,7 to the keyword "Gateway"
Sets IPGATEWAY to the first octet of the IP Address
SETX: Version 1.0a (5/31/96)
Gary Milne - Microsoft MCS
set -m
環境変数をいじってみる。
対象 | コマンド |
---|---|
ユーザ環境変数 | set 変数名 値 |
システム環境変数 | set 変数名 値 -m |
注意
-m
は先頭に付与すると変数名として扱われてしまう。末尾につけること- setxで設定しても変更は適用されない。新しいコンソールを起動すると適用される
ユーザ環境変数
設定する
ユーザ環境変数を以下のように設定してみる。
変数 | 値 |
---|---|
ENV_TEST_SETX | C:/test |
- コンソールを起動する
該当の環境変数が設定されていないことを確認する
- setコマンド
- 環境変数エディタ
- setコマンド
setxコマンドで設定する
setコマンドで見るも反映されていないことを確認する
新たに別のコンソールを起動する
- 該当の環境変数が設定されていることを確認する
- setコマンド
- 環境変数エディタ
- setコマンド
コンソール1
>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません
>setx ENV_TEST_SETX C:/test
コンソール2
>set ENV_TEST_SETX
ENV_TEST_SETX=C:/test
削除はできない
コンソール1
>setx ENV_TEST_SETX ""
>set ENV_TEST_SETX
ENV_TEST_SETX=C:/test
コンソール2
>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません
一見、削除できたように見える。
しかし、環境変数エディタで確認してみたところ、以下のとおりキーが残っている。
こちらにも削除されないようなことが書いてある。
値が空になるが、変数名そのものは残っている。
つまり、setxコマンドは環境変数を削除できない。
区別されない
環境変数では、以下を区別せず、どちらも「定義されていません」と扱う。
- キーがない
- キーはあるが値が空
あくまで、値が空だと「定義されていません」扱いをする文脈だから、一見削除されたように見えるだけである。 setxコマンドではキーを削除できない。
意味が全然ちがう。キーが削除できないとゴミデータとして残る。
システム環境変数
- ユーザ環境変数とおなじ要領でやってみる
コンソール1
>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません
>setx ENV_TEST_SETX C:/test -m
コンソール2
>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません
なんでや。環境変数エディタを見てみる。
あれ、ちゃんと定義されている。成功している。
ユーザ環境変数のほうを削除してから再試行
- 環境変数エディタでユーザ変数側の
ENV_TEST_SETX
を削除するENV_TEST_SETX
キーを選択する- 削除ボタンを押下する
- OKボタンを押下する
- 新たにコンソールを起動する
set ENV_TEST_SETX
を実行するENV_TEST_SETX=C:/test
と表示された。成功set ENV_TEST_SETX ENV_TEST_SETX=C:/test
原因の予想
おそらく、ユーザ環境変数とシステム環境変数でおなじキーENV_TEST_SETX
を定義しているとき、ユーザ環境変数が優先されるのだろう。
そしてユーザ環境変数はENV_TEST_SETX
キーがあるけど値がない。こういう場合、存在しない扱いになる。
よって「定義されていません」と表示された。
というところか。
地雷
setxで環境変数を作成するのって危険では?
という状況になってしまうのでは? だとしたら、コンソールだけで環境変数を操作することは事実上できないのでは? setxの存在意義がなくなってしまう…。
こちらには以下のように書いてある。
だったらENV_TEST_SETX
キーもシステム環境変数の値が定義されているのだから、使ってくれてもいいはず。
「定義されていません」と怒られるのですが。
それとも、OSのバージョンが違う?Path変数だけは特別扱い?値が空のときは「定義されていません」扱いになるの?
一旦おわり
環境変数にはまだ数々の不満があるが、一旦やめる。
次回はさらに脱線してサポートツールについてざっくり調べてみる。