dos 环境变量延迟扩展enabledelayedexpansion详解

论坛 期权论坛 脚本     
niminba   2021-5-23 02:58   1935   0

一,什么是延迟环境变量扩展?

延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫变量扩展!
  CMD在解释我们的命令的时候,首先会读取一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的
命令格式是不是符合它的要求.如果我们要在命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别
出这个变量呢?这时我们就可以在变量名字两边加一个%号,如%name%.当CMD在读取我们的整条命令进行格式匹配的时
候,就会发现name这个字符两边加了%号,就不会把它当作普通字符处理,而是会把它当作一个变量处理,变量名叫name

  然后CMD就会找到变量名对应的值,用该值替换掉这个变量名字(name),(如果变量名不存在值,就返回空值).再将这
个替换好并且匹配的命令执行!这个替换值的过程,就叫做变量扩展,说白了就是把变量的名字,用它的值给替换掉后
执行!也就是批处理如何识别一个变量的过程.(注意:这里只是变量的扩展的意思,不是延迟环境变量扩展,要理解延
迟环境变量扩展,必须先理解什么是变量的扩展) 也就是批处理如何识别一个变量的过程.

例1,

@echo off
set var=test
echo %var%
pause

  CMD在读取到echo %var%这句命令后,就会进行匹配操作,它马上就发现var字符两边有%号,这时CMD就会把它当作一
个变量处理,查看这个var变量名是不是有值,如果有就用该值把变量名var给替换掉,这里我们的var在上一条命令set
 var=test中,给var赋值为test,所以CMD会用test把%var%这个变量名替换掉,替换后的结果就为echo test了.这些步
骤都是CMD进行匹配操作的步骤,匹配完后,他再执行echo test这条语句,这时我们的CMD中就会echo出一个test了.

  什么是环境变量扩展知道了,那什么是延迟环境变量扩展呢?

  在理解环境变量扩展时,我们知道CMD在解释命令时,首先会把一条完整的命令进行读取,然后进行匹配操作,匹配时
它会把命令里的变量用变量的值给替换掉,然后执行这个替换好的命令.问题就出在"一条完整的命令",在BAT中,IF
FOR这样的命令都可以加括号,将一些命令嵌套在里面执行.这样的话对于一条可以加扩号嵌其他命令的命令,他的完
整格式就是for %%i in (....)这样一个整体.此时,如果我们如果在括号里面嵌入一些设置变量值的命令,就会出现
问题了!

例2,

@echo off
for /l %%i in (1,1,5) do (
  set var=%%i
  echo %var%
)
pause

执行后会显示5个空行的错误提示!为什么?根据我们上面说的知识来理解。

  通过这两个例子,大家应该已经理解,如果只有环境变量扩展这个过程的话,如果我们在可以嵌套命令的命令中执行
赋值操作时,会让我们的BAT出现给变量赋值的问题.那么这个时候"延迟环境变量扩展",这个概念就被提出来了。

  在批处理中,我们可以用setloacl enabledelayedexpansion 这个命令来启用"延迟环境变量扩展" ,在我们启用
了"延迟环境变量扩展"后,当CMD在解释含有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进
行匹配操作,这样我们的赋值操作就会完成.并且在"延迟环境变量扩展"启用后,CMD会用!号来判断这是不是一个变量
。如没启用前变量用%name%这样的格式判断,启用后就用!name!这样的格式判断了,这个符号我们需要注意!

例3,

@echo off
setlocal enabledelayedexpansion
set var=1
for /l %%i in (1,1,5) do (
  set /a var =%%i 
  echo !var!
)
pause

这样大家应该明白什么是延迟环境变量扩展了吧.再来一个例子

例4,

@echo off
set var=test & echo %test%
pause

这条命令放在一行,表示他是一条完整的命令,不启用"延迟环境变量扩展",就会出现上面的赋值错误!改成下这样就
OK了:

@echo off
setlocal enabledelayedexpansion
set var=test & echo !var!
pause

二,批处理变量延迟详解

  关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首
先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽,而且有数个代码示例,应该不难理解。在此仅
略作一些补充。

  在许多可见的官方文档中,均将使用一对百分号G&У'7KKi{nX KyJ[nx.KKyJKKyNihYh9yNYik>X[^ij ~yNY.>KyNK#ЮhKnKjj[ZZ#У#УУb673&66У&R673''W63#ФV6`Ч6WBVЦfRV2F&VТ6WBVТ&VXHxyNX ;Т&VТV6VТЧW6RfwC&SУFcУ'7XXxxyYN{>iY.iZi"2Y.h;>ZJ~:XnKK8.KXhnKS#ЮKK>zKKhZHNynih~Knyy{>i##ЮKKyXyN{>inKKB"2KiKY.У'7XiZHNynYZHNyffnVbKNXi{nh(NZHNynX[nKNyJR^h[~iyNX#ЮiKXNX.KyNK>z.KBV^iz[ *iXBX K^.i{c#ЮKn[{.{xcniKYKV6VKBV^iz[{.*in##Ю*>KZfnVnyNXZ{nyNX.[ h[c"2iX{ihX.>[ h[s#ЮyJ[nxYhZHNynKK>i6WF6VFVVFWKnYnViKh#Юi( Kh( ( j ~[ XiXinNzKK>zУ.#УУb673&66У&R673''W63#ФV6bХ&VrrrrXXyK>i~yJ[nx6WF6VFVVFW6WBVЦfRV2F&VТ6WBVТ&VXyNX ;Т&VТ&VrrrrrrryNXK;hJ"R.h[~iN""ТV6VТЧW6RfwC&SУFcУ#УG&[{>h {>7G&#У8KKKhyJ[nx#ЮnY(yNXZ{nXУKKi{nX yJ[nx#ЮKfY(bKУhyJ[nx#ЮXXYhZHNynKK>i~yJ[nxF6VFVVFW#ЮxKnYbf8nKNXyJKNK".h[~iXXУX[nZKyJX[XY~XK^KyJX[n8#У>#УУb673&66У&R673''W63#ФV6`Ч6WBЧ6WB#ЦV6VRPЧW6S&SУFcУ~~XV#SУnZh;>[yNiK#yNX Xf*>KZh.KZ"b3c3[nKKZh.KУN#УУb673&66У&R673''W63#ФV6`Ч6WBf6WB#Ц66"VRRPЧW6RfwC&SУFcУZ^iNxk{N{~h[^h[RRV"VRR^xΙyBV^XyNX J6h[RV#S#Ю8#У^yJX[nZikk9^Zh.KУ^#УУb673&66У&R673''W63#ФV6`Ч6WBХ6WF6VFVVDWV6VRЧW6S&SУFcУ#Ц6YyNyJk9^Z^izxik[xJYfN[xΙ8##Ц6V"VRRRyN ~X^iXnNzj j ~i[IXnNzXNZh.KKBV6VR#Ю[xKn[nKyNYN;yJh8^Xk^ n( cУ#ЮK#УУb673&66У&R673''W63#ФV6bf6WF6VFVVFW6WBЧ6WB#@Ч6WBV"SЧ6WB3V"RЦV6PЧW6S&SУFcУ~KyiyN[niKKi~KN^KKni{iY ~

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP