2014-09-22 75 views
1
REM test.bat 

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

非但没有这两个数字的总和,它总是打印的X前值这个Windows批处理代码有什么问题?

>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% 
+2

这是因为我没有使用EnableDelayedExpansion? -是。 – npocmaka 2014-09-22 22:43:47

回答

2

正如你指出的延迟扩展 - 我想你知道如何解决它 - 唯一的(据我所知)理由要避免它的用法是:如果你想变量生存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% 

编辑写了 呼叫启动命令的新的子上下文提示与遗传variables.Additional%S用于展开下一级的变量。

当我将回声移出示波器时,它为什么会起作用?

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

:why 
echo %X% 

GOTO打破了括号上下文中,但在这种情况下,即使没有GOTO的正确值的%×%将被打印,因为是托架的外侧。

+1

@user - 检查我的编辑。 – npocmaka 2014-09-22 23:59:02