批处理文件无法在IF子句中设置变量

sap*_*tos 10 variables batch-file set

即使匹配发生,以下代码也不会将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"
    )   
)
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 18

您需要使用cmd.exe的延迟扩展选项.

在脚本的顶部,放置:

setlocal enableextensions enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

然后把:

endlocal
Run Code Online (Sandbox Code Playgroud)

在底部.

然后你需要使用!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
Run Code Online (Sandbox Code Playgroud)

哪个输出:

a
b
c
yes for delayed
d
Run Code Online (Sandbox Code Playgroud)

您会注意到检查%xx%不起作用,因为在for语句启动时评估(并且xx为0).延迟扩展!xx! 确实有效,因为每次循环都会对其进行评估.