воскресенье, 19 февраля 2012 г.

bat-ники: изменение переменных в цикле FOR

Если просто попробовать изменять переменную в теле FOR и выводить её на экран, то получим обескураживающий результат: переменная не меняет свое значение внутри цикла, хотя по выходу из него принимает корректное значение, т.е. при выполнении кода:
SET cnt=1
FOR /F "tokens=*" %%f  IN ('dir "%1" /b') DO ( echo %cnt%
SET /a cnt+=1 )
echo Total: %cnt%
получим результат наподобие:
1
1
1
....
1
Total:  285
Для того, чтобы в теле цикла виделось актуальное значение переменной, необходимо использовать SETLOCAL EnableDelayedExpansion, а значение переменной получать, обрамляя её имя не в "%", а в "!":
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%f  IN ('dir "%1" /b') DO ( echo !cnt!
SET /a cnt+=1 )
echo !cnt!
Теперь вывод будет корректен:
1
2
...
284
Total: 285

1 комментарий: