2009-06-11 54 views
2

Не знаю, как объяснить это хорошо, так вот кодCMD For Loop не выполняется установка/значение

@echo off 
set test=0 

for /f %%a in (textfile.txt) do (
rem loops five times(5 lines in textfile.txt) 

set /a test=test+1 
rem Adds 1 to Test 

echo %%a 
rem Echo's correct line in file 

echo %test% 
rem Echo's whatever X was before the loop 

) 

echo %test% 
rem Displays the correct value of X 

pause 

это всего лишь пример того, где я нахожу проблему, txtfile. txt имеет 5 строк, поэтому цикл for отправляется 5 раз, каждый раз тест получает +1 к нему, а// отображает правильное значение X, но последнее эхо в цикле for отображает 0, что и является тестом установите перед циклом.

Значение теста не меняется до тех пор, пока цикл не будет закончен ... есть ли способ исправить это?

Вот что я хочу выполнить, поскольку может быть более простой способ: я хочу запустить цикл for, который находит все rtf findstr в серии подпапок и копирует их все во все каталоги с новым именем , 1.rtf, 2.rtf, 3.rtf и т. Д. Причина, по которой мне нужно переименовать их в передаче, - все они имеют одно и то же имя.

ответ

2

Возможно, вам придется использовать расширенное изменение переменной среды. См. CMD /? для получения дополнительной помощи по этому поводу:

/V: ON Включить задержанную среду с переменным расширением используя! как разделитель . Например,/V: ON позволит! Var! для расширения переменной var varво время выполнения. Синтаксис var расширяет переменные во время ввода, что совсем не так, когда внутри цикла FOR .

...

отложенной переменная среды расширения НЕ включена по умолчанию. Вы можете включить или отключить задержанную среду переменное расширение для конкретного вызов CMD.EXE с помощью переключателя/V: ON или/V: OFF. Вы можете включить или отключить задержка расширения для всех вызовов CMD.EXE на машине и/или сеанс входа в систему пользователя, установив один или оба из следующих значения REG_DWORD в реестре с помощью REGEDIT.EXE:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion 

и/или

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion 

либо 0x1 или 0x0. У пользователя определенная настройка имеет приоритет над настройкой машины. Переключатели командной строки имеют приоритет над настройками реестра .

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

4

Lucero является правильным.

Пример кода:

@echo off 
setlocal enabledelayedexpansion 
echo. 
set numLines=0 
echo examining file '%~f0' 
echo. 
rem loop N times, once for each line in the file 
for /f %%a in (%~f0) do (

    rem add 1 to the numLines variable 
    set /a numLines=!numLines!+1 

    rem echo the first symbol from the line 
    echo line !numLines!: %%a 
) 

rem Display the number of lines in the file 
echo. 
echo The file '%~f0' has %numLines% lines. 
echo. 

pause 
echo. 
endlocal 
+0

Как насчет передачи значения '%% a' любой переменной for-loop? Просто не получишь его в течение нескольких часов – xacinay

0

Просто хотел бы добавить, что ключ к использованию с задержкой расширения ссылается на переменную с помощью вар! синтаксис против% var%. Лучше всего я могу сказать, что в XP замедленное расширение включено по умолчанию, вам просто нужно ссылаться на var, используя!. Это фиксировало мой цикл. Обнаружено это в помощи, упомянутой другими плакатами:

Включить расширенное расширение переменной среды с использованием! как разделитель . Например,/V: ON позволит! Var! для расширения переменной var varво время выполнения. Синтаксис var расширяет переменные во время ввода, что совсем не так, когда внутри цикла FOR .

Я пропустил !! бит сначала.

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