为什么我的 BAT 文件变量没有被覆盖?

Why isn't my BAT file variable being overwritten?

我有这段代码:

@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 将根据记录在文件的属性。 FIND 语句应将“0”或“1”保存到 test.txt 文件中。

输出为:

Hi

Canon_Locked.JPG
Hi

Nikon_Locked.JPG
Hi

0

Press any key to continue . . .

请问为什么 TEMPCODE 变量在循环中没有被覆盖并保留 "Hi" 的原始值。但是在最后的代码块中,它能够读取并回显文件的实际内容。

这是使用 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.
)