Windowsコマンド SET

はじめに

本記事はサクシードが執筆したものです。Windowsコマンドの参考資料としてお読みください。(本記事の内容とお使いのPCのコマンドでは動作や機能など異なる場合があります。ご利用の際はご注意ください。)

SET

cmd.exe 環境変数を表示、設定、または削除します。

SET [変数名=[文字列]]

変数名 環境変数名を指定します。
文字列 変数に割り当てる文字列を指定します。

現在の環境変数を表示するには、パラメーターを指定せずに SET と入力してください。

コマンド拡張機能を有効にすると、SET は、次のように変更されます:

等号や値を指定せずに、変数名だけを指定して SET コマンドを実行すると、SET コマンドに指定された名前にプレフィックスが一致するすべての変数の値が表示されます。たとえば、

SET P

と入力すると、文字 ‘P’ で始まるすべての変数が表示されます。

変数名が現在の環境に見つからない場合は、SET コマンドは、ERRORLEVEL を1 に設定します。

SET コマンドでは、変数の名前に等符号を使用することはできません。

SET コマンドには、2 つの新しいスイッチが追加されています:

SET /A 式
SET /P 変数=[プロンプト文字列]

/A スイッチは、等号の右側の文字列が、評価する数式であることを指定します。式の評価はごく単純で、次の操作がサポートされます。操作は、優先順位の高い順に示されています:

() – グループ化
! ~ – – 単項演算子
* / % – 算術演算子
+ – – 算術演算子
<< >> – 論理シフト
& – ビット演算子 AND
^ – ビット演算子排他的 OR
| – ビット演算子 OR
= *= /= %= += -= – 代入
&= ^= |= <<= >>=
, – 式の区切り記号

論理演算子またはモジュール演算子を使う場合は、式文字列を引用符で囲む必要があります。式内の数値以外の文字列は環境変数文字列として処理され、使用される前に数値に変換されます。指定された環境変数名が現在の環境で定義されていない場合は、値として 0 が使用されます。これにより、いくつもの % 記号を入力して値を取得しないでも、環境変数の値を算術演算に使うことができます。コマンド スクリプト外でコマンド ラインから SET /A を実行すると、式の最終的な値が表示されます。割り当て演算子を使うには、割り当て演算子の左側に環境変数名が必要です。数値は 10 進数ですが、プレフィックスとして 0xを付けると 16 進数、0 を付けると 8 進数になります。従って、0x12 は 18、あるいは 022 と同じです。8 進表記を使う場合は、注意してください。08 や09 は、8 と 9 が有効な 8 進数ではないため、有効な数値ではありません。

/P はユーザーによって入力された入力行を変数の値として設定できるようにします。入力行を読み取る前に、指定されたプロンプト文字列を表示します。プロンプト文字列は空でもかまいません。

環境変数の置換は、次のように拡張されます:

%PATH:文字列 1 = 文字列 2%

は、PATH 環境変数を展開し、その結果に含まれるすべての “文字列 1″ を”文字列 2″ に置き換えます。”文字列 2” に空の文字列を指定すると、展開された出力からすべての “文字列 1″を削除することができます。”文字列 1″をアスタリスクで始め、展開された出力の先頭から、文字列 1 の残りの部分が最初に現れるまでのすべてを一致させることもできます。

また、展開の副文字列を指定することもできます。

%PATH:~10,5%

は、PATH 環境変数を展開し、展開結果の 11 番目 (オフセット 10) の文字から始まる 5 文字だけを使います。長さが指定されなかった場合は、変数の値の残りの長さを既定値とします。オフセットまたは長さのどちらかが負の値の場合、環境変数の値の長さに指定されたオフセットまたは長さをたしてその数を使います。

%PATH:~-10%

は、パス変数の最後の 10 文字が展開されます。

%PATH:~0,-2%

は最後の 2 文字以外のすべてが展開されます。

最後に、遅延環境変数の展開が追加されました。このサポートは常に既定で無効になっていますが、CMD.EXE の /V: のコマンド ライン スイッチを使って有効または無効にできます。
CMD /? を参照してください。

遅延環境変数の展開は、実行時ではなく、テキスト行を読み取るときに展開されるという現在の制限を避けるために役立ちます。次の例は即時変数展開の問題を説明しています。

set VAR=before
if “%VAR%” == “before” (
set VAR=after;
if “%VAR%” == “after” @echo If you see this, it worked
)

この例は、論理的には IF 文が別の IF 文の本体に含まれる複合文なので、両方の IF 文の %VAR% が、最初の IF 文を読み取ったときに展開されます。このため、メッセージは決して表示されません。複合文の中の IF では “before” と “after” が比較され、決して等しくはなりません。同様に次の例も期待したようには動作しません。

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

この例では、現在のディレクトリのファイルの一覧は作成されず、代わりに最後に見つけられたファイルが LIST 変数に設定されます。これは %LIST% が FOR 文が読み取られるとき、一度だけ展開され、そのときは LIST 変数が空だからです。つまり、実際に実行されている FOR ループは

for %i in (*) do set LIST= %i

で、LIST に最後に見つけられたファイルを設定し続けているだけです。

遅延環境変数の展開では、実行時に環境変数を展開するために異なった文字(感嘆符) を使うことができます。遅延環境変数の展開が有効な場合、上記の例は次のように書くと意図したように動作します。

set VAR=before
if “%VAR%” == “before” (
set VAR=after
if “!VAR!” == “after” @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

コマンド拡張機能が有効な場合、SET によって表示される変数の一覧には現れないいくつかの動的な環境変数があります。これらの変数の値は、変数の値が展開されるときに動的に計算されます。ユーザーがこれらの名前の変数を明示的に定義する場合、その定義は下記の動的な定義を無効にします。

%CD% – 現在のディレクトリ文字列に展開します。

%DATE% – DATE コマンドと同じフォーマットで現在の日付に展開します。

%TIME% – TIME コマンドと同じフォーマットで現在の時刻に展開します。

%RANDOM% – 0 から 32767 の間の任意の 10 進数に展開します。

%ERRORLEVEL% – 現在の ERRORLEVEL の値に展開します。

%CMDEXTVERSION% – 現在のコマンド プロセッサ拡張機能のバージョン番号に展開します。

%CMDCMDLINE% – コマンド プロセッサを起動したオリジナル コマンド ラインに展開します。

%HIGHESTNUMANODENUMBER% – このコンピューター上の最大の NUMA ノード番号に展開します。

ページ上部へ戻る