我有以下代码:
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