退出前是否需要 endlocal ?

ser*_*gej 4 windows cmd batch-file

我在批处理脚本中有以下“功能”:

:myfunction
    setlocal
    set _variable=%*
    :: do something with %_variable%
    endlocal
    exit /B 0
Run Code Online (Sandbox Code Playgroud)

注意setlocal/endlocol对。

正在endlocal这里需要?或者它是多余的?是否exit隐式结束本地化?

额外问题:可以在不测试行为的情况下回答这个问题,例如通过引用官方消息来源吗?

Com*_*mpo 6

我不确定您是否有什么想问的,但还没有,但鉴于您发布的脚本,您可以这样测试它:

@Echo Off
Set "_variable="
Call :MyFunction "argument"
Set _variable
Pause
GoTo :EOF

:MyFunction
SetLocal
Set "_variable=%~1"
Exit /B 0
Run Code Online (Sandbox Code Playgroud)

如果您收到一条消息,说明Environment variable _variable not definedthenSetLocal已被Exit命令关闭,即Exit隐式结束本地化。


Ale*_*exP 5

考虑两个批处理文件,a.bat并且b.bat. 批处理文件a.bat调用b.bat并且还调用本地子例程:c。

   @echo off
   rem -------------
   rem This is a.bat
   rem -------------
   echo Outer A=%A%
   setlocal
   set A=Value_A
   echo Local A=%A%
   echo Calling b.bat
   call b.bat
   echo Back from b.bat
   echo A=%A%
   echo Calling subroutine :c
   call :c
   echo Back from subroutine :c
   echo A=%A%
   exit /b
:c
   setlocal
   set A=Value_C
   echo Inside subroutine :c A=%A%
   exit /b
Run Code Online (Sandbox Code Playgroud)

 

   @echo off
   rem -------------
   rem This is b.bat
   rem -------------
   setlocal
   set A=Value_B
   echo Inside b.bat A=%A%
Run Code Online (Sandbox Code Playgroud)

运行a.bat产生:

C> a.bat
Outer A=
Local A=Value_A
Calling b.bat
Inside b.bat A=Value_B
Back from b.bat
A=Value_A
Calling subroutine :c
Inside subroutine :c A=Value_C
Back from subroutine :c
A=Value_A
Run Code Online (Sandbox Code Playgroud)

请注意,看不到任何东西endlocal。