命令 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 的情况。

setlocal 本地变量详解的更多相关文章

  1. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  2. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  3. Maya 常用环境变量详解

    Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...

  4. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  5. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

  6. 4、Ubuntu系统环境变量详解

    参考:Linux公社Ubuntu系统环境变量详解 UNIX/Linux系统中的环境变量和库文件的使用方法 由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,因此我们需要了解 ...

  7. Nginx基础篇(2)- Nginx基本配置文件和变量详解

    Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...

  8. 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解  更新时间:2017年10月27日 09:44:56   作者:铁锚   我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...

  9. Python变量详解

    Python变量详解 目录 Python变量详解 一.变量的定义 二.变量组成的三部分 2.1 变量名 2.1.1 变量名的命名规范 2.1.2 变量名的命名风格 2.2 赋值符号 2.3 变量值 三 ...

随机推荐

  1. SqlServer中把结果集放到到临时表的方法(转)

    一. SELECT INTO   1. 使用select into会自动生成临时表,不需要事先创建   select * into #temp from sysobjects   01. 把存储过程结 ...

  2. 业务逻辑:五、完成认证用户的动态授权功能 六、完成Shiro整合Ehcache缓存权限数据

    一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息 ...

  3. essential C++中关于面向过程和面向对象的说明

    昨天在阅读essential C++中看到了一个关于面向过程和面向对象的区别的例子,感觉挺好的.记录下来.... 这个例子是关于照相机的.照相机有三个性质,一个是控制位置:通常使用3个浮点数据来表示其 ...

  4. UltraISO制作系统ISO镜像

    一.简介 UltraISO是一款功能强大而又方便实用的光盘映像文件制作/编辑/转换工具,它可以直接编辑ISO文件和从ISO中提取文件和目录,也可以从CD-ROM制作光盘映像或者将硬盘上的文件制作成IS ...

  5. loj2395 [JOISC 2017 Day 2]火车旅行

    传送门 分析 我们知道无论往左走还是往右走一定都是往不低于这个点的地方走 于是我们可以考虑用倍增来维护一个点向左和向右走$2^i$最远分别能走到哪里 我们可以先用单调栈求出直走一步的情况,之后再处理倍 ...

  6. Netty中的Future

    先看下Future的整个继承体系,还有一个ChannelFuture不在里面:     在并发编程中,我们通常会用到一组非阻塞的模型:Promise,Future 和 Callback.其中的 Fut ...

  7. [学习笔记]fork深入理解

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> ...

  8. Oracle SQL判断字符串是否在目标字符串中的函数

    转自:http://dacoolbaby.iteye.com/blog/1772156 根据需求,写了一段方法. 用于识别以下的情况: 判断 字符串A  在用逗号分隔的字符串B中是否存在 如: v_s ...

  9. CSS效果:图片切换

    HTML: <html lang="en"> <head> <meta charset="UTF-8"> <meta ...

  10. slice()、substring()、substr()的区别用法

    在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...