環境変数について

隠し環境変数

set "" を実行すると、set を実行したときに加えて、= で始まる環境変数が表示される。

%=ExitCode%
直近に実行した外部コマンドの終了コード。外部コマンド実行直後は、ERRORLEVEL と同じ値。 内部コマンドの実行によって ERRORLEVEL が変化しても影響は受けない。
%=C:%
Cドライブのカレントディレクトリ。%=D:% 等も同様。 そのドライブにカレントディレクトリを移動したことが無ければ、 そのドライブレターに対応する変数は存在しない。

ERRORLEVELの値セット

ERRORLEVELの値はsetで変更できないので、任意の値にセットするには、

echo exit /b 値 > tmp.bat
call tmp.bat

のように、exit を含んだ一時バッチファイルを作る必要がある。 ただし、多くの場合はゼロか非ゼロにセットできれば十分だろう。 いくつかの内部コマンドは ERRORLEVEL の値を変更するので、 副作用が無く ERRORLEVEL に影響する内部コマンドを利用する。 メッセージが出る場合があるので、NUL にリダイレクトする。

cd .       → 0 にセット
md . 2>NUL → 1 にセット
ver >NUL   → 0 にセット
verify >NUL    → 0 にセット
verify X 2>NUL → 1 にセット

setlocal /? には、verify other で 1 にセットする例がある。

環境変数への改行文字のセット

環境変数へ改行文字をセットすることが出来る。 ただし、参照を % で行うと改行文字の後ろは無視される。 そのため遅延展開を有効にして、! で参照する必要がある。

setlocal enabledelayedexpansion
set AAA=ABCDEFG^
[空行]
HIJKLMN
echo !AAA!              → ABCDEFG 改行 HIJKLMN が表示される

[空行]と書いた部分は本当の空行にする。

なお、この方法でセットされる改行文字は CRLF ではなくて、LF の1バイトだけである。 部分文字列参照を行う際には改行文字を1文字としてカウントする。

setlocal enabledelayedexpansion
set AAA=
for /f "delims=" %%A in (filename) do (
set AAA=!AAA!^
[空行]
%%A
)
echo !AAA!

のようにファイルの内容を1つの環境変数にセットすることも出来る。

最初に、「%で参照すると改行以降が切れる」と書いたが、( ) で囲むことで、 改行以降も有効に出来る。

set AAA=echo ABC^
[空行]
echo DEF
%ABC%                → ABC が表示される
(%ABC%)              → ABC 改行 DEF が表示される

「遅延環境変数」とは?

一部誤解されている向きがあるが、一般の環境変数と別に「遅延環境変数」というものが あるわけではない。環境変数というものはあくまで一種類で、 展開の仕方が % によるものと ! によるものと二通りあるだけだ。 % による展開は構文解析時に、! による展開はコマンド実行の直前になされる。

set /? を注意深く読むと気づくが、「遅延環境変数」という言葉は単独では出現せず、 必ず「遅延環境変数の展開」という言葉として現れている。
対応する原語は、「Delayed environment variable expansion」である。 これは「環境変数の遅延展開」と訳すべきであったろう。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-04-30 (土) 02:16:33 (7175d)