批处理文件中 "call: exit, echo" 和 "exit, echo" 之间的区别

Difference between "call: exit, echo" and "exit, echo" in batch file

我遇到了一些关于以下批处理代码的困惑:

@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

@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

唯一的区别是第一个使用call而第二个不使用。此外,"echo" 不适用于第二个。谁能帮我理解这些问题?

exit /b n 做了两件事。它将 errorlevel 设置为 n,然后将 returns 设置为调用当前例程的例程中的下一条指令。

所以在第一个 - call :errerrorlevel 和 returns 设置为显示 errorlevelecho,然后继续 :EOF 终止主程序。

终止主例程,已将 errorlevel 设置为 0

(取决于 if 是 true/false。)

第二个例程终止于 exit 已将 errorlevel 设置为 1001 或 0(取决于 if 为 true/false)并因此处理从未达到 echo.