Programming Field

Setx - DOS/コマンドプロンプト コマンド一覧

[Windows Vista以降] ユーザー別またはシステム全体の環境変数設定の変更を行います。

構文

以下のいずれかのパターンを利用します。

setx[.exe] [/S <computer> [/U [<domain>\]<user> [/P [<password>]]]]
    <variable-name> <value> [/M]
setx[.exe] [/S <computer> [/U [<domain>\]<user> [/P [<password>]]]]
    <variable-name> /K <reg-path>
setx[.exe] [/S <computer> [/U [<domain>\]<user> [/P [<password>]]]]
    <variable-name> /F <file-name>
    {/A <coord> | /R <coord> <search-string>} [/M] [/D <delimiter>]
setx[.exe] [/S <computer> [/U [<domain>\]<user> [/P [<password>]]]]
    /F <file-name> /X [/D <delimiter>]

オプション一覧

/S <computer>, /U [<domain>\]<user>, /P [<password>]

リモートコンピューターとユーザー名(およびパスワード)を指定します。「/S」に続けてコンピューター名、「/U」に続けてユーザー名(必要に応じてドメイン)、「/P」に続けてパスワードを指定します(「/P」のみの場合はパスワード入力を促すプロンプトが表示されます)。/U が省略された場合は現在のログインユーザーでの認証を試みます。

<computer> にローカルコンピューター名を指定することはできません。ローカルの別ユーザーに対して設定を変更するにはRunasを組み合わせて実行します。

/M 書き込む変数をシステム全体の設定として反映させます。システム全体の環境変数設定を保持するレジストリへの書き込み権(主に管理者権限)が必要です。
<variable-name> 設定として書き込む環境変数の名前を指定します。「/X」オプションを利用しない場合は必須です。各スイッチの順番は任意であるため、直前にスイッチがない最初の文字列指定が変数名として扱われます。
<value> 設定として書き込む環境変数の値を指定します。先頭と末尾のダブルクオーテーション「"」は取り除かれるため、ダブルクオーテーションマークが値の一部として必要な場合は「\"」のように指定する必要があります。
/K <reg-path>

レジストリ「<reg-path>」の場所から値を取得し、それを環境変数の値として設定します。レジストリパスは「HKEY_LOCAL_MACHINE (および HKLM)」または「HKEY_CURRENT_USER (および HKCU)」で始まるパスを指定します。また、利用できるレジストリの値の種類は「REG_SZ」「REG_EXPAND_SZ」「REG_MULTI_SZ」および「REG_DWORD」となります(「REG_QWORD」は利用できません)。

<reg-path> がキー名である場合は、そのキーに対する「既定の値」(レジストリエディターにおける「(既定)」と表記されるもの)が用いられます。

/F <file-name> 指定したファイルから値の抽出を試みます。ファイルの内容はテキストとして用いられ、テキストが区切り文字および改行文字(CR+LF または LF)で分割され、それぞれ分割された文字列に対して位置に応じた座標が与えられます。改行文字で分割された分はY座標が、それ以外の区切り文字で分割された分はX座標が増加します。この座標を /A スイッチまたは /R スイッチで利用して、実際の環境変数の値として利用する文字列を取得します。
/A <coord> | /R <coord> <search-string>

(/A または /R のいずれかを利用します。)

/A スイッチはファイルの先頭を「0,0」とした絶対座標に対応したファイル内のテキストを取得し、そのテキストを環境変数の値として設定します。座標は <coord> に「p,q」の形式で指定し、「p」にはY座標(0 から始まる行番号)、「q」にはX座標(横方向のインデックス値)を数値で指定します。この指定はコンマ区切りであり、スペースを含めることはできません。(例: 「2,3」…第2行(先頭から3行目)の第3桁(行内の4ブロック目)にあるテキストを示します。)

/R スイッチは <search-string> で指定したテキストと一致するテキスト(ブロック)をファイル内から検索し、その位置を「0,0」とした相対座標に対応したファイル内のテキストを取得します(<coord> の書式は /A と同じです)。例として、「Something」が先頭から探索して最初に「6,1」の位置のテキストと一致した場合、「/R 2,2 Something」は「8,3」の位置のテキストを取得します(結果的に「/A 8,3」と同じ指定となります)。なお、大文字・小文字は区別されません。

/D <delimiter>

テキストを分割する際の(横方向の)区切り文字を追加で指定します。既定ではスペース文字・タブ文字・キャリッジリターン(CR)が横方向の区切り文字、ラインフィード(LF)が縦方向の区切り文字として使用されます。区切り文字は LF を除いた既定の区切り文字を含めて最大15文字まで利用できます(つまり <delimiter> には12文字まで指定できます)。なお横方向の区切り文字に関しては、種類を問わず区切り文字が連続した場合は1つの区切り文字として扱い、先頭および末尾の区切り文字は無視されます。

※ 縦方向の区切り文字を増やすことはできません。

/X

/F で指定したファイルを(/D で指定したものも含めて)区切り文字で分割した結果を出力します。出力結果は行ごとに「(p,q text)」のような形式で行われるため、/A や /R を利用する際のヒントとして利用することができます。

なお、このオプションは環境変数の設定の書き込みを行いません。

解説

Setxは環境変数の名前と値のペアをレジストリに書き込み、以降その内容を使用し続けられるようにするために利用します。Setコマンドとは以下の点で異なります。

  1. Setxは設定を永続化する(Setはその環境下でしか利用できない)
  2. Setxの変更は現在の環境に対しては何も影響しない

そのため、Setxは主にセットアッププログラムやインストール処理などでの用途に適しています。

なお、既定では現在のユーザーに対する環境変数として保存されますが、/M スイッチを用いるとシステム全体設定として保存されます。

※ 「rundll32 sysdm.cpl,EditEnvironmentVariables」を実行するとこれらの環境変数の設定をGUI上で変更することができます。このUIにおける「システム環境変数」が /M スイッチを使った場合の設定先、「ユーザー環境変数」が /M を使わなかった場合の設定先にあたります。
※ ユーザー別環境変数の設定先は「HKEY_CURRENT_USER\Environment」、システム全体の環境変数の設定先は「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment」です。また、設定値に「%」文字が入る場合は「REG_EXPAND_SZ」、入らない場合は「REG_SZ」の値として保存されます。

設定した環境変数の反映

Setxで行った環境変数の設定はレジストリに書き込まれ、デスクトップに通知されます。そのため、Setxを実行したコマンドプロンプト(バッチファイル)を含め、既に実行中のアプリケーションに対しては変更が反映されません。このため、Setx実行後であっても、既に実行中のアプリケーションを親として新たなアプリケーションを起動した場合にも変更は反映されません。変更が反映されない場合はフォルダーウィンドウをすべて閉じてエクスプローラーをリセットしたり、コンピューターの再起動を行ったりする必要がある場合があります。

/F スイッチでのファイル内容と座標

/F スイッチを用いると環境変数に設定する値をファイルから読み取りますが、この際 /A または /R スイッチで「座標」を指定する必要があります。この座標は区切り文字を用いたテキスト分割によって決められます。例えば /D スイッチを指定しない場合、

Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

という内容を持つテキストファイルは以下のように分割されます(/X スイッチによる出力結果です)。

(0,0 Lorem)(0,1 ipsum)(0,2 dolor)(0,3 sit)(0,4 amet,)
(1,0 consectetur)(1,1 adipiscing)(1,2 elit,)
(2,0 sed)(2,1 do)(2,2 eiusmod)(2,3 tempor)(2,4 incididunt)(2,5 ut)(2,6 labore)(2,7 et)(2,8 dolore)(2,9 magna)(2,10 aliqua.)

このファイルに対して「/A 0,4」を指定すると「amet,」が、「/R 2,1 sit」を指定すると「incididunt」が環境変数の値として用いられます。

サンプル1

setx MYHOME D:\MyHome

「D:\MyHome」という値を持つ「MYHOME」という名前の環境変数を作成・保存します(既に「MYHOME」が存在する場合は上書きされます)。

サンプル2

set DRINK=Beer
setx DRINK "%DRINK%"

環境変数「DRINK」の値を「Beer」とし、現在の環境とユーザー設定の両方に設定します。Setxでは現在の環境への設定(反映)は行われないため、Setコマンドで設定してからその値をSetxにも渡すようにしています。

サンプル3

setx PATHEXT "%PATHEXT%"

現在設定されている環境変数PATHEXTの値をログイン済みユーザーの(既定の)設定値として保存します。

サンプル4

setx APP_ROOT /K "HKLM\Software\Lily System\Launcher\Path" /M

レジストリ値「HKEY_LOCAL_MACHINE\Software\Lily System\Launcher\Path」に格納されている値を「APP_ROOT」という名前の環境変数の値とし、その名前と値のペアをシステム全体の環境変数として作成・保存します。

サンプル5

setx HOST_DEVICE_NAME /F deviceInfo.txt /R 0,1 Name /D :

区切り文字に「:」を加えてファイル「deviceInfo.txt」の内容を分割し、「Name」というテキストブロックの直後に現れるテキストブロックを環境変数「HOST_DEVICE_NAME」の値として設定に保存します。例として、「deviceInfo.txt」の内容が

Address: 192.168.150.1
MAC: 00-11-22-33-44-55
Name: StrangeConsole
Details: Unknown

となっていた場合は、「HOST_DEVICE_NAME」の値は「StrangeConsole」となります。