2013-05-23 3 views
0

У меня очень странная ошибка, возникающая в моем командном сценарии, где цикл For выполняется только один цикл, когда он должен зацикливаться еще много раз (по крайней мере 10 раз).Только для циклов цикла

Можете ли вы рассказать мне, почему мой цикл For только один цикл и как я могу это исправить?

@ECHO off 
CLS 
SETLOCAL 

SET macroFolder=_PLACE_4DM_FILES_HERE 

REM the following for loop only loops once when it should be looping more 
REM because theres over 10 *.4dm files in the folder?? 
for /r ./%macroFolder% %%i in ("*.4dm") do SET "file=%%i" (
    echo %file% 
    REM Note I need to store %%i in a variable so I can edit it later 
    REM And placing %%i in a variable within the for loop results in 
    REM the var being empty for some reason. For eg 
    SET file=%%i 
    ECHO file is %file% 
    REM Prints "file is " 
) 

ECHO. 
PAUSE 
ENDLOCAL 
+0

попробовать это: 'для/г "./%macroFolder%" %% я in ("* .4dm") do echo (%% i' – Endoro

+0

Возможно, удалите кавычки вокруг '* .4dm'? – michaelb958

+0

Вы должны заметить, что форма' ./% macroFolder %' _ то же самое, что и '% macroFolder% ', то есть папка% macroFolder% в текущем каталоге и обычно никогда не используется! – Aacini

ответ

5

У вас (как минимум) две проблемы. Во-первых, вы, кажется, смешивая в квадратные скобки и не квадратные скобки формы for заявления:

for /r ./%macroFolder% %%i in ("*.4dm") do SET "file=%%i" (
    blah blah 
) 

В этом случае не скобки бит выполняется в-петлю-итерацию, но в квадратные скобки бит выполняет после петлевой выход. Вы можете увидеть это с:

for /r ./%macroFolder% %%i in ("*.4dm") do echo 1 (
    echo 2 
) 

, который выводит (в моем случае, когда имеются три 4dm файлы):

1 (
1 (
1 (
2 

Ваша вторая проблема заключается в том, что %% расширения переменной выполняется до того, как команда выполнена, и for команда является многострочной, от for до закрывающей скобки ). Любые переменные, которые вам нужны расширены, которые были установлены в пределах цикл, необходимо сделать с задержкой расширения.

Начните с этого:

@SETLOCAL enableextensions enabledelayedexpansion 
@ECHO off 
CLS 

SET macroFolder=4dmfiles 

for /r ./%macroFolder% %%i in ("*.4dm") do (
    SET file=%%i 
    ECHO file is !file! 
) 

ECHO. 
PAUSE 
ENDLOCAL 

и вы увидите (для моих трех файлов):

file is C:\Users\Pax\Documents\4dmfiles\1.4dm 
file is C:\Users\Pax\Documents\4dmfiles\2.4dm 
file is C:\Users\Pax\Documents\4dmfiles\3.4dm 
+0

+1 Хорошее объяснение! Я никогда не видел форму' for/r ./%macroFo lder% %% i in ("* .4dm") делает SET "file = %% i" (blah blah) 'раньше! – Aacini

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