在 if 和 for 循环中使用变量

在 if 和 for 循环中使用变量

我有以下代码:

echo off
set n=11
set m=12
set /a nme=3
set /a mdiff=nme-1
pause
if %n% NEQ %m% (
    if %mdiff% LEQ 3 (
        for /l %%C in (1,1,3) do (
            if %%C EQU 1 (
                set mon=Apr
            )
set num=1%mon%
        )
    )
)
echo %num%
pause

它给出的是输出1而不是1Apr。但是当我将其放在set num=1%mon%所有 if 和 for 循环之外时,它会给出正确的结果。

请向我解释这里发生了什么以及如何在循环内获得正确的结果。

if另外,和级别的最大深度是多少for

答案1

你需要做的是SetLocal EnableDelayedExpansion在脚本的顶部并使用!s 包围变量。

延迟扩展将导致变量在执行时而不是在解析时扩展,此选项通过命令打开SETLOCAL。当延迟扩展生效时,可以使用!variable_name!(除了正常的%variable_name%)引用变量

延迟变量扩展在使用FOR循环时通常很有用,通常整个FOR循环被视为单个命令,即使它跨越批处理脚本的多行。

基本上,for循环只解析一次。每次循环迭代时,语句都会执行。通过启用此选项,变量可以在执行时更改,而无需重新解析,即在循环内。

@echo off
SetLocal EnableDelayedExpansion

set n=11
set m=12
set /a nme=3
set /a mdiff=nme-1
pause
if %n% NEQ %m% (
    if %mdiff% LEQ 3 (
        for /l %%C in (1,1,3) do (
            if %%C EQU 1 (
                set mon=Apr
                set num=1!mon!
            )
        )
    )
)
echo %num%
pause

相关内容