Batch file 区别于;呼叫:退出,回显“;及;退出,回显“;批处理文件

Batch file 区别于;呼叫:退出,回显“;及;退出,回显“;批处理文件,batch-file,errorlevel,Batch File,Errorlevel,以下批处理代码让我感到困惑: @echo off Setlocal EnableDelayedExpansion set rootpath=%1 if '%1'=='' ( call :ERR REM Exit /b 1001 ) else ( exit /b 0 ) echo %errorlevel% goto :EOF :ERR Exit /b 1001 及 唯一的区别是第一个使用call,而第二个不使用。另外,“echo”在第二个上不起作用。有人能帮我理解这些问题吗?退出/b n做

以下批处理代码让我感到困惑:

@echo off
Setlocal EnableDelayedExpansion

set rootpath=%1

if '%1'=='' (
call :ERR
REM Exit /b 1001
) else (
exit /b 0
)
echo %errorlevel%
goto :EOF

:ERR
Exit /b 1001


唯一的区别是第一个使用call,而第二个不使用。另外,“echo”在第二个上不起作用。有人能帮我理解这些问题吗?

退出/b n做两件事。它将
errorlevel
设置为
n
,然后返回到调用当前例程的例程中的下一条指令

因此,在第一个-
调用中:err
设置
errorlevel
并返回到
echo
,其中显示设置的
errorlevel
,然后继续执行
:EOF
终止主例程

errorlevel
设置为0后终止主例程

(取决于
是否为真/假。)


在第二种情况下,
exit
errorlevel
设置为1001或0(取决于
if
为真/假)终止例程,因此处理永远不会到达
echo

谢谢Magoo,我想我已经开始知道它是如何工作的了。第一个调用是子例程,退出时返回主例程。而第二个退出主例程(如果不是子例程)。对吗?没错`这是当前的例行程序。如果它是一个子例程,那么回到该例程的调用者——它可能有很多层次。如果它是主程序,那么它是剩下的唯一要终止的程序,所以这就是被终止的程序。
@echo off
Setlocal EnableDelayedExpansion

set rootpath=%1

if '%1'=='' (
REM call :ERR
Exit /b 1001
) else (
exit /b 0
)
echo %errorlevel%
goto :EOF

:ERR
Exit /b 1001