Windowsバッチファイルのforループ内で変数を利用する方法
forループ内で変数を扱うには”setlocal ENABLEDELAYEDEXPANSION”で遅延環境変数の展開を有効にしないと機能しないようです
遅延環境変数…初めて聞きました(^^;
下記のバッチファイルはforループ内では機能しません
1 2 3 4 5 6 7 8 9 10 11 12 |
@echo off set cnt=0 FOR /F "usebackq delims==" %%i in (`set`) do ( set /A cnt=cnt+1 echo %cnt%番目の環境変数 set var=%%i echo %var% set var1=%var:~0,2% echo %var1% ) echo 環境変数の合計:%cnt% pause |
forループ内では機能していないのですが最後の”echo 環境変数の合計:%cnt%”は正常な値が表示されました
1 2 3 4 5 6 7 8 |
0番目の環境変数 ECHO は <OFF> です。 ECHO は <OFF> です。 0番目の環境変数 ECHO は <OFF> です。 ECHO は <OFF> です。 環境変数の合計:41 続行するには何かキーを押してください . . . |
修正したバッチファイルです。遅延環境変数の展開は%の代わりに!を使います
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off setlocal ENABLEDELAYEDEXPANSION set cnt=0 FOR /F "usebackq delims==" %%i in (`set`) do ( set /A cnt=cnt+1 echo !cnt!番目の環境変数 set var=%%i echo !var! set var1=!var:~0,2! echo !var1! ) echo 環境変数の合計:%cnt% pause |
結果
1 2 3 4 5 6 7 8 |
40番目の環境変数 VS110COMNTOOLS VS 41番目の環境変数 windir wi 環境変数の合計:41 続行するには何かキーを押してください . . . |
ちなみに下記のバッチファイルでも同様の結果が得られます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@echo off set cnt=0 FOR /F "usebackq delims==" %%i in (`set`) do ( call :sum %%i ) echo 環境変数の合計:%cnt% pause goto end :sum set /A cnt=cnt+1 echo %cnt%番目の環境変数 set var=%1 echo %var% set var1=%var:~0,2% echo %var1% goto :EOF :end |
setlocal
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 26 27 28 29 30 31 32 33 34 35 |
C:\Windows\System32>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 以外の値に初期化されます。 |