这个Windows批处理代码有什么问题?

时间:2014-09-22 22:21:49

标签: batch-file windows-7

REM test.bat

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

它不会得到两个数字的总和,而是始终打印前一个值X

>test.bat 1 2
ECHO is off

>test.bat 3 4
3

>test.bat 4 4
7

是因为我没有使用EnableDelayedExpansion吗?

编辑:当我将回声移出示波器时,为什么会这样?

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

:why
echo %X%

1 个答案:

答案 0 :(得分:2)

当你指出延迟扩展时 - 我想你知道如何解决它 - 想要避免它的用法的唯一(afaik)理由是你想要变量在endlocal语句中存活并在括号上下文中使用变量值同时。所以你可以使用额外的CALL或隧道:

@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%

正在编辑 该调用使用继承的变量启动命令提示的新子上下文。附加的%s用于扩展下一级别的变量。

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

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

:why
echo %X%

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