为什么我的 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.
)
我有这段代码:
@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.
)