我有两个非常简单的批处理文件示例:
给变量赋值:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,结果是:
FOO: 1
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)
但是,如果我将相同的两行放在 IF NOT DEFINED 块中:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Run Code Online (Sandbox Code Playgroud)
这出乎意料地导致:
FOO:
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)
这应该与 IF没有任何关系,显然该块正在被执行。如果我在 if 上方定义 BAR,则只显示 PAUSE 命令中的文本,正如预期的那样。
是什么赋予了?
跟进问题:有没有办法在没有 setlocal 的情况下启用延迟扩展?
如果我从另一个内部调用这个简单的示例批处理文件,则该示例设置 FOO,但仅限于 LOCALLY。
例如:
测试调用者.bat
@call test.bat
@echo FOO: …Run Code Online (Sandbox Code Playgroud) 如何从子程序内部退出批处理文件?
如果我使用 EXIT 命令,我只需返回到我调用子例程的行,然后继续执行。
下面是一个例子:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)
输出:
Quitting...
Still here!
Run Code Online (Sandbox Code Playgroud)
更新:
这不是一个正确的答案,但我最终做了一些事情:
@echo off
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ECHO You shouldn't see this!
GOTO END
:SUBROUTINE_WITH_ERROR
ECHO Simulating failure...
EXIT /B 1
:HANDLE_FAIL
ECHO FAILURE!
EXIT /B 1
:END
ECHO NORMAL EXIT!
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)
双管语句:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
Run Code Online (Sandbox Code Playgroud)
是简写:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Run Code Online (Sandbox Code Playgroud)
我仍然很想知道是否有一种方法可以直接从子例程中退出,而不必让 CALLER …