これは、コマンドプロンプト(cmd.exe) Advent Calendar 2015 - Qiitaの7日目の記事です。
※Windows 10 Home 64bit 搭載のcmd.exeにて検証を行っています。

### setlocal /? ``` バッチ ファイルで環境変更のローカル化を開始します。SETLOCAL を実行した後で 変更した環境設定は、そのバッチ ファイルだけで有効です。前の設定を復元するときは ENDLOCAL を実行しなければなりません。バッチ スクリプトの終わりに達したとき、 暗示的な ENDLOCAL が、そのバッチ スクリプトによって発行されたすべての未完了の SETLOCAL コマンドのために実行されます。

SETLOCAL

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

SETLOCAL バッチ コマンドは、オプション引数を受け取ることができます: ENABLEEXTENSIONS / DISABLEEXTENSIONS は、コマンド処理機能を有効または無効にできます。これらの 引数は、CMD /E:ON または /E:OFF スイッチよりも優先されます。 詳細については、CMD /? を参照してください。 ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION は、遅延環境変数の展開を有効または無効にできます。 これらの引数は、CMD /V:ON または /V:OFF スイッチよりも優先します。 詳細については、CMD /? を参照してください。 これらの変更は、SETLOCAL コマンドの実行前の設定にかかわらず、対応する ENDLOCAL コマンドを実行するまで継続されます。

SETLOCAL コマンドに引数を指定すると、ERRORLEVEL の値が設定されます。 2 つの有効な引数が指定された場合は 0、指定されない場合は 1 になります。 この機能をバッチ スクリプトで使って、拡張機能が利用可能かどうかを判断 することができます。それには、次のように入力します:

VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo 拡張機能を有効にできません

この方法が使えるのは、古いバージョンの CMD.EXE では、SETLOCAL は ERRORLEVEL の値を設定しないためです。VERIFY コマンドに誤った引数を指定すると、 ERRORLEVEL の値は 0 以外の値に初期化されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="section">
    #### 遅延環境変数
    昨日の「set /?」の話でも出てきた、遅延環境変数のことです。
```dosbatch
setlocal ENABLEDELAYEDEXPANSION

```もしくは
```dosbatch
cmd /V:ON

```で、遅延環境変数が使用できるようになります。<br/>
基本的にコマンドプロンプトやBATファイル内の環境変数は実行前にインライン展開されるイメージですが、遅延環境変数(「!」でくくった変数。ENABLEDELAYEDEXPANSIONが必要)を使用すると実行時に展開されます。※コマンドプロンプトではなぜかうまくいかなかったので、BATファイルで検証です

<div class="section">
    ##### 遅延環境変数を使用しない場合
    ```dosbatch
@echo off

set LIST=
for %%i in (a b c) do set LIST=%LIST% %%i
echo %LIST%

pause

```出力

c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
</div>
<div class="section">
    ##### 遅延環境変数を使用する場合
    ```dosbatch
@echo off
setlocal ENABLEDELAYEDEXPANSION

set LIST=
for %%i in (a b c) do set LIST=!LIST! %%i
echo %LIST%

pause

```出力

a b c

1
2
3
4
</div>
</div>
</div>