やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

setxコマンドを入手して環境変数を設定してみる

Windows環境変数を設定するコマンドツールにsetxがあるという話。

setコマンド

setコマンドで環境変数を設定できる。ただしこのコマンドを実行したコンソール内でのみ有効。

永続的に環境変数を変更することはできない。

1
2

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だけ取得したほうがいいかも?

  1. ダウンロードしたWindowsXP-KB838079-SupportTools-ENU.exeファイルを7zなどのツールで開く 1
  2. support.cabファイルを展開する 2
    3
  3. support.cabファイルを7zなどのツールで開く
    4
  4. setx.exeなど欲しいファイルを展開する 5

配置

  1. コンソールを起動する
  2. setx.exeを展開したパスへカレントディレクトを移動させる

または、コマンド実行時にsetx.exeのフルパスを指定する。

なお、setx.exeが存在するディレクトリを環境変数のPathに追記すれば、カレントディレクトリがどこでもsetxと打てば使えるようになる。

動作確認

setx

1

>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
  1. コンソールを起動する
  2. 該当の環境変数が設定されていないことを確認する

  3. setxコマンドで設定する
    3

  4. setコマンドで見るも反映されていないことを確認する
    4

  5. 新たに別のコンソールを起動する

  6. 該当の環境変数が設定されていることを確認する

コンソール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 2 3

コンソール1

>setx ENV_TEST_SETX ""

>set ENV_TEST_SETX
ENV_TEST_SETX=C:/test

コンソール2

>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません

一見、削除できたように見える。

しかし、環境変数エディタで確認してみたところ、以下のとおりキーが残っている。

4

こちらにも削除されないようなことが書いてある。

値が空になるが、変数名そのものは残っている。

つまり、setxコマンドは環境変数を削除できない。

区別されない

環境変数では、以下を区別せず、どちらも「定義されていません」と扱う。

  • キーがない
  • キーはあるが値が空

あくまで、値が空だと「定義されていません」扱いをする文脈だから、一見削除されたように見えるだけである。 setxコマンドではキーを削除できない。

意味が全然ちがう。キーが削除できないとゴミデータとして残る。

システム環境変数

  1. ユーザ環境変数とおなじ要領でやってみる 1

コンソール1

>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません

>setx ENV_TEST_SETX C:/test -m

コンソール2

>set ENV_TEST_SETX
環境変数 ENV_TEST_SETX が定義されていません

なんでや。環境変数エディタを見てみる。

2

あれ、ちゃんと定義されている。成功している。

ユーザ環境変数のほうを削除してから再試行
  1. 環境変数エディタでユーザ変数側のENV_TEST_SETXを削除する
    • ENV_TEST_SETXキーを選択する
    • 削除ボタンを押下する
    • OKボタンを押下する
      1
  2. 新たにコンソールを起動する
  3. set ENV_TEST_SETXを実行する
  4. ENV_TEST_SETX=C:/testと表示された。成功 4

    set ENV_TEST_SETX ENV_TEST_SETX=C:/test

原因の予想

おそらく、ユーザ環境変数とシステム環境変数でおなじキーENV_TEST_SETXを定義しているとき、ユーザ環境変数が優先されるのだろう。

そしてユーザ環境変数ENV_TEST_SETXキーがあるけど値がない。こういう場合、存在しない扱いになる。 よって「定義されていません」と表示された。

というところか。

地雷

setxで環境変数を作成するのって危険では?

  1. 削除もできないからどんどんキーばかり溜まっていく
  2. 偶然、ユーザ環境変数とシステム環境変数でおなじキーになる
  3. 参照したいパスが見えなくなって動作しなくなる

という状況になってしまうのでは? だとしたら、コンソールだけで環境変数を操作することは事実上できないのでは? setxの存在意義がなくなってしまう…。

こちらには以下のように書いてある。

PATHが両方に設定されている場合「システム環境変数;ユーザ環境変数」という形で設定される。

だったらENV_TEST_SETXキーもシステム環境変数の値が定義されているのだから、使ってくれてもいいはず。 「定義されていません」と怒られるのですが。

それとも、OSのバージョンが違う?Path変数だけは特別扱い?値が空のときは「定義されていません」扱いになるの?

一旦おわり

環境変数にはまだ数々の不満があるが、一旦やめる。

次回はさらに脱線してサポートツールについてざっくり調べてみる。

GTKにもどりたい。環境変数の調査なんてサクっと終わるだろうとそう思っていたらドツボにハマってきた。