2014-09-22 48 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