setlocal/endlocal 命令

setlocal 和 endlocal 命令是用来定义一个局部区域,这个局部区域中的环境变量任何变化都不会改变原先的环境变量。

setlocal

MicroSoft 官方文档解释:

Setlocal creates a local scope and endlocal terminates the local scope. Any changes made within the setlocal and endlocal scope are discarded, thereby leaving the original environment unchanged. You can nest these two commands to a maximum of 32 levels. For more information about the setlocal and endlocal commands, see Setlocal and Endlocal

开始批处理文件中环境改动的本地化操作。在执行 setlocal 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 endlocal 。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 setlocal 命令,都会有一个隐含的 endlocal 被执行。语法:

SETLOCAL

如果命令扩展被启用,setlocal 会如下改变:

setlocal 批命令现在可以接受可选参数:

  • enableextensions / disableextensions  启用或禁用命令处理器扩展。这些参数比 cmd /e:on 或 /e:off 开关有优先权。请参阅 cmd /? 获取详细信息。

  • enabledelayedexpansion / disabledelayedexpansion  启用或禁用延缓环境变量扩展。这些参数比 cmd /v:on 或 /v:off 开关有优先权。请参阅 cmd /? 获取详细信息。

无论在 setlocal 命令之前它们的设置是什么,这些修改会一直保留到匹配的 endlocal 命令。

如果有一个参数,setlocal 命令将设置 errorlevel 的值。如果有两个有效参数中的一个,该值则为零。用下列技巧,您可以在批脚本中使用这个来决定扩展是否可用:

@ECHO OFF
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions

这个方法之所以有效,是因为在 cmd.exe 的旧版本上,setlocal 未设置 errorlevel 值。具有不正确参数的 verify 命令将 errorlevel值初始化成非零值。

实例1:演示使用 setlocal 和 endlocal 定义局部区域,然后在局部区域中修改 path。

@echo off
echo before setlocal:
set path
pause

setlocal
rem reset environment var path
set path=E:\tools
echo after setlocal and reset path
set path
pause
endlocal

echo recovery path by endlocal
set path

输出结果:

C:\Users\Administrator\Desktop>test.bat
before setlocal:
Path=D:\ProgramFiles\Python38-32\Scripts\;D:\ProgramFiles\Python38-32\;D:\...
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;...
请按任意键继续. . .
after setlocal and reset path
Path=E:\tools
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;...
请按任意键继续. . .
recovery path by endlocal
Path=D:\ProgramFiles\Python38-32\Scripts\;D:\ProgramFiles\Python38-32\;D:\...
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW;.PY;...

从上例我们可以看到环境变量 PATH 第1次被显示得时候是系统默认路径。被设置成了 “E:\TOOLS” 后显示为 “E:\TOOLS”。但当 endlocal 后我们可以看到他又被还原成了系统的默认路径。但这个设置只在该批处理运行的时候有作用。当批处理运行完成后环境变量 PATH 将会还原。

实例2:使用 enabledelayedexpansion 启动延缓环境变量扩展,利用 for 循环将当前目录下面的文件名称拼接到 LIST 变量中。

@echo off
setlocal enabledelayedexpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%
endlocal

输出结果:

C:\Users\Administrator\Desktop>test.bat
 20200604101217.png moment-with-locales.js moment.js setlocal.txt test.bat...

注意,使用感叹号(!)访问变量,即 !LIST!,而不是 %LIST%。

endlocal

结束批处理文件中环境改动的本地化操作。在执行 endlocal 之后所做的环境改动不再仅限于批处理文件。批处理文件结束后,原先的设置无法还原。语法:

ENDLOCAL

如果命令扩展被启用,endlocal 会如下改变:

  • 如果相应的 setlocal 用新的 enableextensions 或 disableextensions 选项启用或停用了命令扩展;那么,在 endlocal 之后,命令扩展的启用/停用状态会还原到执行相应的 setlocal 命令前的状态。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号