2011年2月4日金曜日

SETLOCAL = バッチファイルの中でローカル環境変数の使用を開始する - Windowsのコマンドプロンプト(bat,cmd)

Windowsコマンド。制御文と環境変数
○Windows XP
バッチファイルの中で、ローカル環境変数の使用を開始します。

o 32回まで連続発行する事が出来ます。
o コマンド拡張機能の有効、無効切り替えの他、遅延環境変数を有効にする事が出来ます。


**** 書式
--------
setlocal [ オプション ]
--------

o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
o オプション = 次のオプションを使用出来ます。複数並べる時は、空白で区切ります。
    + enableextensions = コマンド拡張機能を有効にします。
    + disableextensions = コマンド拡張機能を無効にします。
    + enabledelayedexpansion = 遅延環境変数を有効にします。
    + disabledelayedexpansion = 遅延環境変数を無効にします。
o コマンド拡張機能や遅延環境変数についての説明は、下の機能欄をどうぞ。


**** 戻り値 ( ERRORLEVELの値。確認分のみ )
o 0 = バッチファイルから呼び出した時。成功、もしくは失敗。
    + 最大 setlocal 再帰レベルに到達しました。 = 連続呼び出しの上限(32回)を超えています。
o (設定なし) = コマンドプロンプト画面から呼び出した時。この時は、ERRORLEVELの値を更新しません。
    + コマンドプロンプト画面では、40回程度呼び出しても、エラーメッセージを出しませんでした。


**** 使用例
o go.bat などのバッチファイルにして、コマンドプロンプト画面にドロップして実行します。
--------
@echo off
set MIKUSAN=ミクさん
echo %MIKUSAN%。おはようございます。
setlocal
set MIKUSAN=ネギ
echo 今年は、%MIKUSAN%が豊作です。
endlocal

echo %MIKUSAN%も、ネギを一本どうぞ。
--------

o 表示結果は、「ミクさん。おはようございます。」「今年は、ネギが豊作です。」「ミクさんもネギを一本どうぞ。」になります。


**** 機能
o バッチファイルの中で、ローカル環境変数の使用を開始します。
o バッチファイルから呼び出した時は、常に、変数 ERRORLEVEL の値を 0 に設定します。
o オプションを指定すると、コマンド拡張機能や遅延環境変数の有効、無効を切り替える事が出来ます。

o ENDLOCAL コマンドを呼び出すと、元の状態に戻ります。
    + SETLOCAL コマンドを複数回実行していた場合、ENDLOCAL コマンドは、最後に実行した SETLOCAL コマンド1つに対して働きます。
    + ENDLOCAL コマンドを2回実行すると、2つ前の状態に戻ります。
o このコマンドは、32回連続発行出来ました。33回目に、エラーメッセージを出します。

o コマンドプロンプト画面上で、このコマンドを直接実行した時は、何もしません。
    + この時、このコマンドは、変数 ERRORLEVEL の値を更新しません。
    + 何もしませんので、33回目以降にエラーメッセージを出す事もしません。

** コマンド拡張機能について
o Windowsでは、コマンドの機能を制限したり、全機能を使うよう切り替える事が出来ます。
    + コマンド拡張機能の切り替えは、CMD コマンドの /E オプションでも可能です。
o なお、Windows XP Service Pack 3の初期設定では、コマンド拡張機能を使用出来るようになっています。

** 遅延環境変数について
o 次の3つの条件が揃った時は、括弧の中で設定した環境変数の値を普通に参照する事が出来ません。
o そのような時に、遅延環境変数を使って解決する事が出来ます。
    + 「(」「)」を使って複数行を書いている
    + かつ、括弧の中で変数の値を設定している
    + かつ、括弧の中でその変数の値を参照したい

o 遅延環境変数を使った例
--------
@echo off
set MIKUSAN=ミクさん

setlocal enabledelayedexpansion
echo %MIKUSAN%。おはようございます。

if "%MIKUSAN%"=="ミクさん" (
set MIKUSAN=ネギ
echo %MIKUSAN%も、!MIKUSAN!を一本どうぞ。
)
echo なんと、その%MIKUSAN%を選ぶとは。
endlocal

echo お目が高いですね。%MIKUSAN%。
--------

o 表示結果は、「ミクさん、おはようございます。」「ミクさんもネギを一本どうぞ。」「なんと、そのネギを選ぶとは。」「お目が高いですね。ミクさん。」になります。

o 最初に SETLOCAL コマンドで、遅延環境変数を使う事を宣言します。
o IF文の中の %環境変数% は、IF文を実行する前の値で置き換わります。
    + 遅らせて評価したい環境変数は、!環境変数! の形で書きます。
o IF文が終わった時点で、IF文内で変更した内容が反映されます。
o そして、ENDLOCAL コマンドを実行すると、環境変数は、SETLOCAL コマンド以前の状態に戻ります。


**** メモ
o SETLOCAL コマンドは、オプションが間違っていてもエラーになりません。書く時には注意します。


**** 確認したバージョン
o Windows XP Service Pack 3


==
関連ページ:
    ▼Windowsコマンド。制御文と環境変数▼ABC順
    ▼Windowsコマンド一覧▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > ENDLOCAL = ローカル環境変数の使用を終了する
    PATH = 実行可能ファイルを検索する場所を表示、設定する
    %ERRORLEVEL% = コマンドの戻り値
    +
    %CMDEXTVERSION% = コマンド拡張機能のバージョン番号