Batch file 此Windows批处理代码有什么问题?

Batch file 此Windows批处理代码有什么问题?,batch-file,windows-7,Batch File,Windows 7,它总是打印X的上一个值,而不是两个数字的总和: REM test.bat @ECHO OFF IF NOT "%~1" == "" IF NOT "%~2" == "" ( SET /A "X=%~1+%~2" echo %X% ) 这是因为我没有使用enabledayedexpansion 编辑:当我将回声移出范围时,它为什么会起作用 >test.bat 1 2 ECHO is off >test.bat 3 4 3 >test.bat 4 4 7

它总是打印
X
的上一个值,而不是两个数字的总和:

REM test.bat

@ECHO OFF
IF NOT "%~1" == "" IF NOT "%~2" == "" (
    SET /A "X=%~1+%~2"
    echo %X%
)

这是因为我没有使用
enabledayedexpansion

编辑:当我将回声移出范围时,它为什么会起作用

>test.bat 1 2
ECHO is off

>test.bat 3 4
3

>test.bat 4 4
7
@ECHO OFF
:: using call
IF NOT "%~1" == "" IF NOT "%~2" == "" (
    SET /A "X=%~1+%~2"
    call echo %%X%%
)

@ECHO OFF
:: using tunneling
setlocal enableDelayedExpansion
IF NOT "%~1" == "" IF NOT "%~2" == "" (
    SET /A "X=%~1+%~2"
    rem echo !X!
)
endlocal & set x=%x%
echo %x%

正如您指出的延迟扩展-我想您知道如何修复它-想要避免使用它的唯一(afaik)原因是,如果您希望变量在endlocal语句中生存,同时使用括号上下文中的变量值。因此,您可以使用其他调用或隧道:

@ECHO OFF
IF NOT "%~1" == "" IF NOT "%~2" == "" (
    SET /A "X=%~1+%~2"
    GOTO why
)
GOTO :EOF

:why
echo %X%
已进行编辑 该调用使用继承的变量启动命令提示的新子上下文。其他%s用于在下一级别展开该变量

当我将回声移出范围时,它为什么工作

>test.bat 1 2
ECHO is off

>test.bat 3 4
3

>test.bat 4 4
7
@ECHO OFF
:: using call
IF NOT "%~1" == "" IF NOT "%~2" == "" (
    SET /A "X=%~1+%~2"
    call echo %%X%%
)

@ECHO OFF
:: using tunneling
setlocal enableDelayedExpansion
IF NOT "%~1" == "" IF NOT "%~2" == "" (
    SET /A "X=%~1+%~2"
    rem echo !X!
)
endlocal & set x=%x%
echo %x%

GOTO会破坏括号上下文,但在这种情况下,即使没有GOTO,也会打印%x%的正确值,因为它在括号之外。

这是因为我没有使用EnableDelayedExpansion吗-对