在 if 和 for 循环中使用变量

Ann*_*nna 3 windows batch

我有以下代码:

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
Run Code Online (Sandbox Code Playgroud)

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

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

另外,最大深度iffor级别是多少?

Bob*_*Bob 5

您需要做的是将 aSetLocal EnableDelayedExpansion放在脚本的顶部并!在变量周围使用s 。

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

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

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

@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
Run Code Online (Sandbox Code Playgroud)