即使匹配发生,以下代码也不会将Run更新为N。这意味着我不会进入CALL代码。我在这里错过了什么吗?
SET Run=Y
REM Check current files date/time information and establish if the file has been present too long in the directory
REM Skip first 4 lines as header information not required
FOR /f "tokens=1-5 skip=4 delims= " %%G IN ('dir /OD "%SRCH_CRITERIA% "') DO (
ECHO "Params to processFile: " %%G %%H %%I ""%%K""
IF %%K.==. (
ECHO "K:nothing"
SET Run=N
ECHO %Run%
)
IF %%K==free (
ECHO "K:FREE"
SET Run=N
ECHO %Run%
)
ECHO %Run% RUN
IF %Run%=="Y" (
CALL :processFile "%%G" "%%H" "%%I" "%%K"
)
)
答案 0 :(得分:18)
您需要使用cmd.exe的延迟扩展选项。
在脚本的顶部,输入:
setlocal enableextensions enabledelayedexpansion
然后把:
endlocal
在底部。
然后您需要使用!Run!
代替%Run%
。
您的代码无法正常工作的原因是整个 FOR语句(包括其中的命令)在遇到时会被评估。这就是%Run%
变量扩展的重点。
通过使用延迟扩展,在实际需要之前(在块中设置它们之后),不要扩展它们。
您可以在此脚本中看到差异:
@echo off
setlocal enableextensions enabledelayedexpansion
set xx=0
for %%i in (a b c d) do (
echo %%i
set /a "xx = xx + 1"
if %xx%==3 echo yes for normal
if !xx!==3 echo yes for delayed
)
endlocal
输出:
a
b
c
yes for delayed
d
您会注意到%xx%
的检查不起作用,因为在for
语句开始时(xx
为0)进行了评估。延迟扩展!xx!
可以工作,因为每次循环都会对其进行评估。