目次
-
先頭に@をつける
またはecho off
-
setlocal
、endlocal
setlocal enableDelayedExpansion
-
先頭に@をつける
またはecho off
コマンド部分の出力をしないようにする。
コマンドの先頭に@をつけた場合はそのコマンドのみが対象となり、
echo off
の場合は以降全てのコマンドが対象となる。
再度コマンド部分の出力をするようにしたい場合は、echo on
を入力する。コードrem @でコマンド部分を非表示にする @echo using @ rem 何も設定しない状態だと、コマンド部分が表示される echo no setting rem @でコマンド部分を非表示にしたecho offを実行 @echo off rem echo offの後なので、@を付けずともコマンド部分は非表示になる echo command is gone echo on rem echo onの後なので、@を付けないとまたコマンド部分が表示されるようになっている echo command is return @pause
結果using @ (パス)>echo no setting no setting Command is gone (パス)>echo Command is return Command is return 続行するには何かキーを押してください...
なお、実際はecho off
を含めた全てのコマンドを非表示にしたい場合がほとんどなので、@echo off
を頭に記述し、echo on
は記述しないことがほぼ常となる。
-
setlocal
、endlocal
変数のスコープ範囲を、setlocal
~endlocal
間に限定する。
つまりここで定めた範囲内における変数への変更は、範囲外では反映されない。コード@echo off set a=1 echo %a% @point1 rem 1つ目のスコープ開始 setlocal echo %a% @point2 set a=2 echo %a% @point3 rem 2つ目のスコープ開始 setlocal echo %a% @point4 set a=3 echo %a% @point5 endlocal rem 2つ目のスコープ終了 echo %a% @point6 endlocal rem 1つ目のスコープ終了 echo %a% @point7
結果1 @point1 1 @point2 2 @point3 2 @point4 3 @point5 2 @point6 1 @point7 続行するには何かキーを押してください...
スコープを出ると、スコープ突入直前の値に回帰していることがわかる。
※なお
endlocal
は、記述せずともバッチファイル終了時に必ず勝手に実行されるようになっている。
そのためスコープのネストをしなければ、実際はsetlocal
の記述だけで事足りる場合が多い。
しかし、可読性のためにもendlocal
は明記しておくに越したことはないと思う。なお環境変数に変更を加えたとしても、末尾の暗黙的な
endlocal
によってその変更は全て破棄されるので、不必要な影響を与えてしまわないかという心配は無用。
-
setlocal enableDelayedExpansion
変数は、通常その変数が記述されている "行" が読み込まれた瞬間に、一気に展開される。
しかしこれを記述すると、変数はその変数が記述されている行が読み込まれた瞬間には展開されず、 少し遅れて "命令(コマンド)" が読み込まれた瞬間に一気に展開されるようになる。コード@echo off set a=1 if %a% == 1 ( set /a a+=1 rem if文に入った時点のものが展開されるため、 rem 1+1は反映されず、1が表示されることになる。 echo %%a%% in if is %a% rem ただし内部的に計算は完了しているので、 rem 文外で再度表示させれば、反映後の結果が表示される。 ) echo %%a%% out if is %a% setlocal enableDelayedExpansion set b=11 if %b% == 11 ( set /a b+=1 rem enableDelayedExpansionが設定されている時に、 rem 「%」ではなく「!」で変数を囲むことにより、 rem 展開タイミングの遅延が発動する。 echo %%b%% is %b% echo ^^!b^^! is !b! ) endlocal pause
結果%a% in if is 1 %a% out if is 2 %b% is 11 !%! is 12
if文やfor文は、始まりのカッコ(
から終わりのカッコ)
までが1行と見なされる。
よって文中で変数に対しどのような操作を行ったとしても、これを設定していなければ文に入った時点のもので置換されてしまうことになるため、
if文やfor文での変更を即時反映させて扱いたい場合は、設定が必須となる。