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%
答案 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%的正确值,因为它位于括号之外。