2015-05-19 2 views
1

У меня есть этот блок кода:Почему моя переменная файла BAT не перезаписывается?

@ECHO OFF 

SET "SRCFOLDER=C:\Users\MyUserName\Desktop\PhotoTests" 

SET "TEMPCODE=Hi" 
ECHO %TEMPCODE% 
ECHO. 

FOR /F "tokens=*" %%G IN ('DIR /B %SRCFOLDER%') DO (
    ECHO %%G 
    CALL tooltipInfo.bat %%G 19 | FIND /C "Star" > test.txt 
    SET /P TEMPCODE=<test.txt 
    ECHO %TEMPCODE% 
    ECHO. 
) 

SET /P TEMPCODE=<test.txt 
ECHO %TEMPCODE% 
ECHO. 

PAUSE 

Я запутался выход, как я заметил, что переменная в цикле FOR не перезаписывается, что я думаю, что должно быть содержание «test.txt» , который будет меняться при каждом запуске цикла FOR.

Для целей этого примера файл tooltipInfo.bat будет отображать текстовую строку типа «1 звезда» или «3 звезды» в зависимости от рейтинга, записанного в свойствах файла. Оператор FIND должен привести к тому, что «0» или «1» будет сохранен в файле test.txt.

Выход:

Hi 

Canon_Locked.JPG 
Hi 

Nikon_Locked.JPG 
Hi 

0 

Press any key to continue . . . 

Могу ли я узнать, почему переменная TEMPCODE не переписывается в контуре и сохраняет исходное значение «Привет». Однако в последнем блоке кода он смог прочитать и отобразить фактическое содержимое файла.

+0

Еще один программист подставляли отсроченным расширением. Можем ли мы позволить пакетным файлам уже умереть? Синтаксис старше большинства программистов и полностью тупой. Мое предложение для кого-то, начинающего в партии: вместо этого используйте Powershell. –

ответ

1

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

Если переменная изменяется в течение цикла (через SET), то вам нужно будет изменить % к ! для переменных внутри скобок, а также включается с задержкой расширения с использованием setlocal

SETLOCAL enabledelayedexpansion 
FOR /F "tokens=*" %%G IN ('DIR /B %SRCFOLDER%') DO (
    ECHO %%G 
    CALL tooltipInfo.bat %%G 19 | FIND /C "Star" > test.txt 
    SET /P TEMPCODE=<test.txt 
    ECHO !TEMPCODE! 
    ECHO. 
) 
Смежные вопросы