2013-05-29 3 views
0

Это самая странная вещь. Я не знаю, Forfiles асинхронный или что-то, но этот код кажется легким и очевидным для меня, и не работает:Использование Set/A в файле forfiles.exe в пакетном файле

set a=0 
forfiles /S /C "cmd /c if @isdir==FALSE set /a a+=1 & echo !a!" 

Простой счетчик я думал. Однако то, что получение выводимый: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

И в конце a все еще установлен в 0.

Я включил delayedexpansion. Почему это не работает?

ответ

2

Кажется, forfiles вызывает для каждого файла новый cmd с новой «свежей & пустой» средой. 1 от 10 производится командой set, как вы можете видеть в этом примере:

forfiles /S /C "cmd /v:on /c if @isdir==FALSE set/a a+=1 >nul&echo !a!" 
0 
0 
0 
... 

Чтобы заставить его работать, лучше использовать в for цикл:

for /r %%i in (*) do set /a a+=1 &echo !a! 
+1

'Forfiles/s' в рекурсивно вложенных папок, поэтому для эквивалентного цикла 'for' требуется'/r'. –

+1

'for/f %% i in ('dir/b/s/a: -D') установить/a a = = 1 & echo! A!' Будет делать это рекурсивно. –

+0

Да, вы совершенно правы, спасибо! – Endoro

Смежные вопросы