CMD For Loop не содержит установленное значение - PullRequest
2 голосов
/ 11 июня 2009

Не знал, как это объяснить, поэтому вот код

@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 раз, каждый раз, test получает +1 к нему, а / a отображает правильное значение X, но последнее эхо в цикле for отображает 0, то есть тест, установленный перед циклом.

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

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

Ответы [ 3 ]

4 голосов
/ 11 июня 2009

Лусеро прав.

Пример кода:

@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
2 голосов
/ 11 июня 2009

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

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

...

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

и / или

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

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

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

0 голосов
/ 16 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...