2015-05-19 59 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 Star”或“3 Stars”等文本字符串。 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. 
)