cmdのforやif内値代入!setできない原因は遅延環境変数! | 自作PCテクニカルセンター (jisakupc-technical.info)
バッチファイルの式の評価がいつ行われるかの仕様の問題です。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
お世話になります。
以下のバッチファイル(本当にやりたいことはもっと別ですが単純化して確認)が正常に動作せず困っております。
%%nは1からのカウント
%m%と%l%は、%%nをもとに計算
1回目の実行では、
%%nはカウントアップするけれど%m% %l%は空白
ctrl+cで中断して
2回目以降
%%nはカウントアップするけれど
%m% %l%は、固定値(中断したところの値?)が表示される
やりたいことは、カウントアップしながら自~至のパラメータを変えて別のexeを繰り返し実行したいのですが
カウントアップの段階でうまくいかない状況です。
以下テストバッチファイル
----ここから
@echo off
for /l %%n in (0,1,100) do (
timeout /nobreak 1
SET /a m=%%n+1
SET /a l=%%n+0
echo n = %%n
echo m = %m%
echo l = %l%
)
----ここまで
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
質問作成者が受け入れた回答
cmdのforやif内値代入!setできない原因は遅延環境変数! | 自作PCテクニカルセンター (jisakupc-technical.info)
バッチファイルの式の評価がいつ行われるかの仕様の問題です。
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2022
あともう一つ
call echo m = %%m%%
call echo l = %%l%%
%のエスケープ%%
call で2回目評価
call call echo l = %%%%l%%%%
Hiroshi Aoyagi様
質問の for 文は for ... ( から )までが一つのコマンドとなります。
%m% 等の環境変数はコマンドの実行前に評価されるため、ループの間同じ値になります。
コマンドプロンプトでset /? でsetコマンドのヘルプを表示すると説明があります。
また SETLOCAL /? で遅延環境変数の展開についての説明が参照できます。
これを避けるには以下の2つの方法があります。
★方法1
for 文の内部処理をサブルーチンにする。
@echo off
for /l %%n in (0,1,100) do call :SUB %%n
goto :NEXT
:SUB
timeout /nobreak 1
SET /a m=%1+1
SET /a l=%1+0
echo n = %1
echo m = %m%
echo l = %l%
goto :eof
:NEXT
★方法2
遅延環境変数の展開が有効にした上で!m!のように記述する
@echo off
setlocal enabledelayedexpansion
for /l %%n in (0,1,100) do (
timeout /nobreak 1
SET /a m=%%n+1
SET /a l=%%n+0
echo n = %%n
echo m = !m!
echo l = !l!
)
以上ご参考までに
解決しました
ありがとうございました
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2022
set/?
くらいは読んで読んで読んでから質問しましょう。