DOS 批处理 setlocal命令、endlocal命令详解
作者:扬科网络
在 cmd
(Windows 命令提示符) 脚本中,@setlocal
是一个常用的组合命令,由两部分组成:@
和 setlocal
。
- @:在脚本中,
@
用于阻止命令的显示。通常,在执行批处理文件时,每一行命令都会被显示出来。当你在一行命令前加上@
,这行命令就不会在命令提示符窗口中显示出来。这经常用于使脚本的输出更加干净、整洁。 - setlocal:这是一个命令,它开始局部化环境更改。通常在批处理文件中使用,以确保在脚本中所做的任何环境更改(例如设置或修改环境变量)不会影响到调用此批处理的上下文或其他批处理文件。当脚本执行完毕,使用
endlocal
命令可以结束这种局部环境,恢复所有的环境设置到setlocal
之前的状态。
因此,@setlocal
的组合用途是在批处理文件的开始部分使环境更改局部化,同时不显示这条命令本身。这是编写批处理脚本时的一种常见做法,以确保脚本不会无意中修改全局环境设置。
一、setlocal命令
命令格式
setlocal [ enableExtensions | disableExtensions ] [ enableDelayedExpansion | disableDelayedExpansion ]
命令功能
setlocal 命令用于开始批处理文件中环境变量的本地化。本地化将持续到出现匹配的 endlocal 命令, 或者到达批处理文件结尾为止。
【enableExtensions参数】
启用cmd.exe的命令扩展开特性。extension是“扩大,延伸”的意思
【disableExtensions参数】
关闭cmd.exe的命令扩展特性。
【enableDelayedExpansion参数】
开启cmd.exe的变量延迟展开特性。expansion是“扩展,展开”的意思
【disableDelayedExpansionn参数】
关闭cmd.exe的变量延迟展开特性。
【注意】
enableExtensions参数、disableExtensions参数相比 cmd.exe的 /E参数,它们具有更高的优先级。
enableDelayedExpansion参数、 disableDelayedExpansion参数相比 cmd.exe的 /V参数,它们具有更高的优先级。
二、endlocal命令
命令格式:
endlocal
命令功能:
endlocal 命令用于结束批处理文件中环境变量的本地化。
【“环境变量本地化”的作用】
在批处理文件中实现“环境变量本地化”,可以避免其对外部运行环境的“污染”
示例
demo1.bat的内容如下:
::demo1.bat @echo off set var=200
demo2.bat的内容如下:
::demo2.bat @echo off setlocal set var=200 endlocal
运行
C:\>set var=5
C:\>demo1
C:\out>echo %var%
200
C:\>set var=5
C:\>demo2
C:\>echo %var%
5
C:\>
总结
setlocal命令和endlocal命令在批处理文件中有效(在dos命令行环境中无效)
setlocal命令执行以前的所有变量状态(例如:变量值), 在endlocal命令(或者批处理文件)执行完后会被恢复
在setlocal和endlocal(或者批处理文件的结尾处)之间,如果定义了新变量,在执行 endlocal命令后,该变量会被删除(即:其值为空)
在setlocal和endlocal(或者批处理文件的结尾处)之间,可以正常使用setlocal命令执行以前的所有变量(包括外部dos命令行环境定义的变量)
无参的setlocal命令和带参的setlocal命令(例如:setlocal enabledelayedexpansion)都遵守上述规则
无参的setlocal命令只对变量所做的修改进行本地化,不会影响其作用域(setlocal和endlocal(或者批处理文件的结尾处)之间的局域空间)的命令扩展特性和变量延迟展开特性。
编写批处理脚本时,为了不“污染”外部运行环境,同时对自己的运行环境进行“默认设置”,应该在批处理脚本中使用setlocal命令(和endlocal命令),下面是一个比较常用的“批处理脚本模板”
::demo.bat @echo off setlocal enableExtensions :: your code ... endlocal
写作不易,如果您觉得对您有用