CMD For Loop не содержит значение set/a

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

@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, что является значением test перед циклом.

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

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


person Community    schedule 11.06.2009    source источник


Ответы (3)


Лусеро прав.

Пример кода:

@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
person Cheeso    schedule 11.06.2009
comment
Как насчет передачи значения %%a любой переменной цикла for? Просто не могу добиться этого часами - person xacinay; 18.06.2014

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

/V:ON Включить отложенное расширение переменной среды с помощью ! как разделитель. Например, /V:ON позволит использовать !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. Индивидуальные настройки пользователя имеют приоритет над настройками машины. Переключатели командной строки имеют приоритет над параметрами реестра.

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

person Lucero    schedule 11.06.2009

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

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

Я упустил из виду !! сначала немного.

person Kyle    schedule 15.04.2010