barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

воскресенье, 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 комментарий: