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

10
以下代码未能更新“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"
    )   
)
1个回答

19
你需要使用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! 是有效的,因为它在每次循环中都会被重新评估。


谢谢paxdiablo,完全解决了我的问题。 - sapatos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接