我是靠谱客的博主 矮小美女,最近开发中收集的这篇文章主要介绍Window批处理-延迟环境变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

延迟环境变量在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下运行依次运行下面的两条命令:

CODE:  [Copy to clipboard]

set a=1

 

set /a a+=1 > 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。这时,如果我们想得到我们想要的结果,那么就要开启延迟环境变量了。

 

延迟环境变量,顾名思义,延迟读取了环境变量。当我们开启延迟环境变量之后,命令解释器就不再是运行命令前先将环境变量读取出来再执行,而是当我们用到延迟环境变量的时候再去从环境变量中读取出来,这就延迟了环境变量读取的时间。

 

还是上面的例子,我们开启延迟环境变量后再次运行:

CODE:  [Copy to clipboard]

cmd /v:on

 

set a=1

 

set /a a+=1 > 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=0

for /l %%i in (1,1,10) do (

set /a a=%%i%%2

if !a!==0 echo 1-10的偶数有:%%i)

pause

上面的代码是输出1-10中能被2整除的数(在批处理中取余运算符要用%%代替命令提示符下的%),虽然if是单独的一行,没有和set在一行,由于有“()”括起来,他只是for语句中的一部分。

 

如果我们将!a!换成%a%,那么由于a初始值是0,那么运行for的时候就会将a的值读出来,虽然开启了延迟环境变量,但在if的时候就不会再次读取a的值了,由于0==0永远成立,那么结果就会将1-10所有值全部例出来。

 

转自:http://www.cn-dos.net/forum/viewthread.php?tid=51971&fpage=2

最后

以上就是矮小美女为你收集整理的Window批处理-延迟环境变量的全部内容,希望文章能够帮你解决Window批处理-延迟环境变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部