setlocal 本地变量详解

命令 setlocal (开启本地变量)  endlocal (结束本地变量)
很多新手不理解这句话是什么意思,在批处理中有什么作用。
其实在批处理中 setlocal 作用很大,配合 endlocal (结束本地变量)
它可以使你的代码更简洁,易读,且不容易出错。
举例:
假设你在批处理的开头部分有这么一句  set var=123
那么在批处理结束以前,变量 var 的值就永远是 123
除非你 运行了  set "var=" 来把它的值清空。或 set var=别的什么 把它的值改变
否则它的值永远是 123
当写某些代码时,需要把变量的值累加,如: set var=%var%567 此时var的值就是 123567
或是 set /a var+=1 (这是当var的值是有效数字时)每运行一次,var的值就会加1
但当某段代码需要重复运行时,我们有时、甚至是经常需要var的值回到原始的值,即:123
你可能会说这还不好办,一句就ok 了 set var=123或set var=
不错,确实是这样,但如果我们需要将一大堆的变量都会回到原始值呢?
比如: var num a b c d e f .........
你难道要
set var=
set num=
set a=
set b=
........
........
这样吗?
有了setlocal 和 endlocal 就不用这么麻烦了。
看代码

@echo off
set var=123
set num=4456
set a=ham
setlocal
set var=abcd
set num=jkl
set a=efg
set max=1234567
::到了这一步,我想不用echo你应该也都知道,这三个变量的值改变了,
::并且还给一个新的变量赋了值 max
::对于不熟悉setlocal 和 endlocal 命令的朋友来说,要想让这
::三个变量回到开始的值,可能就只有回到开头那三句去了,其实不用。
::一句就可以了,看下面的
endlocal
echo %var% %num% %a%
echo %max%
pause
看到区别了吗?
不错,setlocal 和 endlocal 这两句中间的命令给所有的变量赋的值都消失了,
就好像从没有运行过它们一样。
运行 setlocal 以前变量的值是什么 在运行 endlocal 以后,
又回到了什么。如果之前是空值,即:没有赋值
如:例子中的 max 那么 echo %max% 就会显示 ECHO 处于关闭状态
以前 cn-dos 里有位版主(好像就是我们论坛的第三方软件版块的现任版主)曾经很形象的解释过这个问题,
这里借用一下 ,记得不是很清楚了,加一点我自己的描述。
他说:
  批处理运行时会开辟一块地方给变量,我们可以把它想像为一块黑板,
你可以在黑板上任意写字,在批处理中这种写字,就是给变量赋值或清空或改变变量的值
如:set var=123  set num=   set /a str+=1 set var=%var% %num% 等等之类的。
而 setlocal 命令就是在黑板中又划出一块方块来,你在这之后所写的字就全在这个方块中,
(当然这个方块的容量、大小不会有什么限制,你或者把他理解为在这个黑板上又覆盖了一块同样大小的新的黑板,
更为恰当。当然这个黑板的容量大小应该要减去你在原来那块黑板上所写的内容,这个就不在这里讨论了,
知道个大概就行。)
当运行 endlocal (结束变量)后,相当于把你在原来那块黑板上划的方块擦掉了,连内容一起擦掉了。
又或者说,把这个新的黑板拿走了,你在这个新黑板上写的字也都没有了,回到你面前的又是原来的那块黑板,
当然你以前写在上面的字仍然还在。它不会擦掉你的,也不会自动给你写些新东西上去。
也就是 原来的变量还是原来的值,原来没有赋值的,仍然是空值。不管你在那块新黑板上写过什么,都过去了,
就象什么也没发生过一样。
  当新黑板上的内容与老黑板上的内容发生冲突时,则以新黑板上的内容为准,
  若老黑板上的内容没与新黑板的内容冲突时,老黑板上的内容在新黑板中仍然有效。
在提一句,新黑板最多只能连续覆盖32块,否则就会提示 “以达到最大递归层”的错误信息。
所谓 “连续覆盖”就是运行了 setlocal 而没有运行 endlocal 的情况。
原文地址:https://www.cnblogs.com/pekkle/p/6568847.html