【转】BAT 延迟变量
延迟环境变量在bat里是重中之重,虽然前面说过,熟练应用for才算会写批处理,但如果不懂延迟环境变量的话,那么你就只能写出简单的批处理,而for语句也不能发挥最大的作用。
延迟环境变量在cmd下默认是关闭的,如果要使用延迟环境变量,可以用以下两种方法开启:
1. cmd下开启/关闭延迟环境变量
在cmd下开启或延迟环境变量用/v参数:
cmd /v:on //开启延迟环境变量 cmd /v:off //关闭延迟环境变量
2. 批处理中开启/关闭延迟环境变量
在批处理中开启或关闭延迟环境变量用setlocal命令:
setlocal EnableDelayedExpansion //开启延迟环境变量 setlocal DisableDelayedExpansion //关闭延迟环境变量
延迟环境变量到底有什么用呢?这里我们就要从cmd命令解释器工作原理来说起了。
当我们准备执行一条命令的时候,命令解释器会先将命令读取,如果命令中有环境变量,那么就会将变量的值先读取来出,然后在运行这条命令,如:echo %windir%,当我们执行这条命令的时候,命令解释器会先读出%windir%的值,即c:\windows,然后执行echo,得到的结果是屏幕上显示出c:\windows。这个应该很好理解。
但是,有的时候,我们在执行一条命令的时候,命令解释器将环境变量的值读出来以后,我们的环境变量的值发生了改变,这时个再执行命令就是使用的变量改变前的值,这就不是我们想要的结果了,举个例子:
在cmd下运行依次运行下面的两条命令:
set a=
set /a a+= > nul & echo %a%
运行后我们会发现,echo 得到的结果是1,而不是我们想像中的2,这时候我们可以直接输入set回车,就可以看到a的值是2,但为什么显示出来的是1而不是2呢?这就是因为在准备执行上面第二句set /a a+=1 > nul & echo %a%的时候,命令解释器先将a的值读取出来了,这时还没有执行set /a a+=1,所以a的值是1,然后将1给了set,同时也给了echo,所以,虽然计算后,a=2,但显示出来的还是a=1。这时,如果我们想得到我们想要的结果,那么就要开启延迟环境变量了。
延迟环境变量,顾名思义,延迟读取了环境变量。当我们开启延迟环境变量之后,命令解释器就不再是运行命令前先将环境变量读取出来再执行,而是当我们用到延迟环境变量的时候再去从环境变量中读取出来,这就延迟了环境变量读取的时间。
还是上面的例子,我们开启延迟环境变量后再次运行:
cmd /v:on
set a=
set /a a+= > nul & echo !a!
在第一句开启延迟环境变量后,运行第三句的时候就不是先将a的值读出来,而是在使用到的时候再读:运行到set /a的时候读出a=1,执行后a=2,在执行echo的时候再去读取a的值a=2,所以最后的结果就是我们想要的2了。
我们注意到,在这里调用环境变量a不是用的%a%而是用的!a!。这是因为,我们用命令开启了延迟环境变量,只是允许我们使用延迟环境变量,并不是所有变量的应用是延迟读取,这时我们也可以用%a%以正常的方式读取环境变量,如果我们想使环境变量延迟读取,我们就要用到!a!来代替%a%
延迟环境变量在批处理中应用很广泛,想要作出功能强大的批处理,有时延迟环境变量是不可缺少的。而应用最多的地方就是在for和if语句里,因为for和if作为一个语句,后面可以跟许多命令,不管跟多少命令,但他还是一条命令,所以说在for和if中应用的最多。举个例子:
@echo off & setlocal EnableDelayedExpansion
set a=
for /l %%i in (,,) do (
set /a a=%%i%%
if !a!== echo -10的偶数有:%%i)
pause
上面的代码是输出1-10中能被2整除的数(在批处理中取余运算符要用%%代替命令提示符下的%),虽然if是单独的一行,没有和set在一行,由于有“()”括起来,他只是for语句中的一部分。
如果我们将!a!换成%a%,那么由于a初始值是0,那么运行for的时候就会将a的值读出来,虽然开启了延迟环境变量,但在if的时候就不会再次读取a的值了,由于0==0永远成立,那么结果就会将1-10所有值全部例出来。
原文链接:http://hi.baidu.com/ynnal911/blog/item/2e91f91bd7c6e50a34fa41d6.html
【转】BAT 延迟变量的更多相关文章
- bat 批处理变量
@echo off setlocal enabledelayedexpansion d: rem 更改d:\bat为当前目录 cd /d bat rem 变量使用 + echo %a% echo %C ...
- bat 判断变量字符串中是否包含字符串
bat 判断变量字符串中是否包含字符串 @echo off rem way 1 set str=machine-order-service set matchStr=orderd echo %str% ...
- 关于bat的变量赋值和解析机制
以下的演示涉及几个知识点: 1. 怎样把命令输出内容保存到变量中? 2. 多次改变变量值,为什么在for或是if的()中的无效,怎样变通? 3. bat的function实现? 见代码,和代码凝视 : ...
- cmd dos bat 深度变量文件夹指定文件
echo off ::指定起始文件夹 :: 指定文件夹 set DIR = abc :: d:/abc 改脚本放在d: set DIR="%cd%" echo DIR=%DIR% ...
- Windwos Java‘bat 环境变量配置脚本
@echo off echo 正在设置Java环境变量 pause wmic ENVIRONMENT create name="JAVA_HOME",username=" ...
- bat延迟执行脚本,利用choice实现定时执行功能
choice是选择语句,具体语法另外再讲.今天利用它来实现定时执行功能.废话少说直接上代码: 示例一: @echo off for %%a in (我 是 一 个 中 国 人) do ping -n ...
- 延迟环境变量扩展(bat)
延迟环境变量扩展(bat) 之前遇到一些环境变量的问题,简单记录下 From:http://www.cnblogs.com/dongzhiquan/archive/2012/09/05/2671218 ...
- 变量延迟(setlocal)之浅见
变量延迟,浅见认为就是变量预处理,在事先声明变量,告诉cmd环境哪个先哪个后.默认情况下是停用,可以用两种方法启用/停用: 一.cmd /v:on 和cmd /v:off ,范围在cmd这个环境直至e ...
- bat批处理延迟运行脚本(zz)
@echo off:aaapause 这里是你需要运行的程序for /l %%i in (0,1,10000) do echo %%i>nulgoto aaa 当然bat延迟运行还有其他的一些方 ...
随机推荐
- 如何在 Ubuntu 15.04 系统中安装 Logwatch
大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日 ...
- bzoj3594: [Scoi2014]方伯伯的玉米田
dp新优化姿势... 首先,当我们拔高时,一定右端点是n最优.因为如果右端点是r,相当于降低了r之后玉米的高度.显然n更优. 那么可以dp.dp[i][j]表示前i个拔高j次的LIS.dp[i][j] ...
- 解决visualsvn监听ip 错误的问题
系统重启+休眠之类的,弄几次,莫名其妙的svn就连接不上了, 有时候启动不起,有时候是启动连接不上,发现监听的ip错了 TCP [::]:443 [::]:0 ...
- HDU 4089 Activation 概率DP 难度:3
http://acm.hdu.edu.cn/showproblem.php?pid=4089 这道题中一共有两个循环: 1.事件1 如果一直落在Activation failed事件上,那么就会重新继 ...
- JMeter常用函数整理
"_csvRead"函数 csvRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数. 下面具体讲一下如何使用csvread函数: 1.新建一个csv或者t ...
- bzoj 3687 bitset的运用
题目大意: 小呆开始研究集合论了,他提出了关于一个数集四个问题:1. 子集的异或和的算术和.2. 子集的异或和的异或和.3. 子集的算术和的算术和.4. 子集的算术和的异或和.目前为止,小呆已经解决了 ...
- powershell玩转xml之20问
powershell玩转xml之20问 powershell 传教士 原创文章 2014-01-30,2015-10-27改 允许转载,但必须保留名字和出处,否则追究法律责任 问:xml文件编码情况如 ...
- linux学习笔记3:linux的网络配置,rpm包,shell以及samba服务器的使用和安装
1.linux下的shell<linux命令.编辑器和shell编程> (1)shell种类有很多,常用的有三种,在linux可以通过ls -l /bin/*sh 来显示所有已安装的she ...
- hdu 1069
//Accepted 264 KB 0 ms //每种block只有三种方法,且每种放法至多放一次 //规定三条边的顺序后 //把所有的block按x递增排序,x相同则按y递增排序 //然后dp // ...
- 关于resolve非泛型方法不能与类型实参一起使用
今天mvc新建三层时,写到bll层中一直报下面的错误,检查了几遍赶脚并没有什么错.最后发现缺少一些引用. 如下面的图,少添加了下面的两个引用.Unity是微软模式与实践团队开发的一个轻量级.可扩展的依 ...