• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >DOS/BAT > dos 环境变量延迟扩展enabledelayedexpansion详解

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

作者:mdxy-dxy 字体:[增加 减小] 来源:互联网

mdxy-dxy 通过本文主要向大家介绍了dos,dos命令大全,dos攻击,dos命令,dos是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

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

例1,

@echo off
set var=test
echo %var%
pause
</div>

  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
</div>

执行后会显示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
</div>

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

例4,

@echo off
set var=test & echo %test%
pause
</div>

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

@echo off
setlocal enabledelayedexpansion
set var=test & echo !var!
pause
</div>

二,批处理变量延迟详解

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

  在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion
)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它
看作是引用(Reference)、调用(Call)或者获取(Get)。

  而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后
,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环
境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的
“扩展”,它仍然属于命令行的预处理范畴。

  而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||
”等连接起来的复合语句。
  因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中
就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,
从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空
间,而非for语句内部。

  而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取
了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,
这个扩展行为被“延迟”了。

  延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off(此处说法有误,应为
 CMD /v:on——namejm 注),它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,
常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在
endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。


   上面是willsort写的帖子对于新手来说比较难理解。不过没关系,我们先分析一个例子,同样是引用willsort老
大的。

本例启用了变量延迟,是个正确的例子!

例1,

@echo off & setlocal EnableDelayedExpansion
for /f "tokens=* delims=" %%i in ("Hello world.") do (
  set n=%%i
  set n=!n:ld.=t!
  set n=!n:o w= S!
  set n=!n:He=Wi!
  echo !n!
)
Pause
</div>

将上面代码保存为.bat双击执行后会显示“Will Sort”字符串,下面将讲解每个语句的意思:

1.@echo off & setlocal EnableDelayedExpansion
关闭命令回显,并启用变量延迟

2.for /f  "tokens=* delims=" %%i in ("Hello world.") do (  )
for命令及其参数的使用,请大家在论坛里搜索相关字眼。限于篇幅问题,这里不作讨论。如果此时你不明白它的意
思,那么你就当它的作用是把字符串“Hello world.”赋值给%%i好了,当然这只是权宜之计,以后一定要学习for
的使用!

3.set n=%%i
把%%i的值(即Hello world.)赋予给变量n,这个大家都知道吧

4.set n=!n:ld.=t!
这里要讲讲set替换字符的功能了。这个语句的意思是,先获取变量n的值(此时n的值是“Hello world.”),然后
将字符“t”替换字符“ld.”,然后再将替换后的结果再次赋值给变量n(此时n的值变为“Hello wort”)。至于
set替换字符的编写格式,大家可以在CMD键入“set/?”找到“%PATH:str1=str2%”这段有说明

5.set n=!n:o w= S!
意思和上句一样,只是替换和被替换的内容不同。它是将“ S”替换“o w”(注意S前面和w前面都有个空格),其
实willsort老大是想证明set替换字符是支持句点和空格的(第4句“ld”后面有个.)。此时n的值为“Hell Sort”


6.set n=!n:He=Wi!
这句不用说了吧,执行完这句后n的值为“Will Sort”

7.echo !n!
显示变量n的值

需要注意的是,一旦启用了变量延迟,就要用!号把变量括起来,而不能用%号。

  好了,每句的意思已经说完了,下面要讲本帖真正要讨论的变量延迟的问题。
这里又要引用Will Sort老大的说明:当CMD读取for语句时,其后用一对圆括号闭合的所有语句将一同读取,并完成
必要的预处理工作,这其中就

您可能想查找下面的文章:

  • DOS(bat)字符串替换原理
  • windows xp下没有dos的choice命令的解决方法
  • dos命令行choice命令使用详解
  • DOS批处理中%cd%与%~dp0的区别详解
  • 如何利用DOS批处理实现定时关机操作详解
  • dos命令行设置IE代理的实现代码
  • DOS批处理中%~dp0等扩充变量语法详解
  • dos 环境变量延迟扩展enabledelayedexpansion详解
  • 批处理入门手册之批处理常用DOS命令篇(find findstr)
  • 批处理入门手册之批处理常用DOS命令篇(md、rd、ren、move)

相关文章

  • 精通批处理教程 批处理从入门到精通
  • dos 文件删除 del命令
  • cmd批量打开网页和关闭网页的批处理代码
  • 反序列出文本的每行内容的批处理
  • 重定向符(、)的使用
  • 再谈DOS批处理下格式化日期字符串的三种方法(详解)
  • 命令行实现MAC与IP地址绑定 ip mac绑定 如何绑定mac地址
  • 批处理技术内幕 ECHO命令介绍
  • Windows下通过bat获取网络连线实际名称,加强IP类设置脚本的兼容性
  • Tree、Unformat、Vsafe命令的区别与使用说明

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 用asp.net实现 取页面中的所有链接
    • 右键菜单中添加打开MS-DOS的批处理bat
    • 利用 secedit.exe 配置本地审核策略
    • Windows下使用批处理实现启动关闭mysql
    • 字符串查找 cmd find命令
    • Xcopy 复制文件和目录,包括子目录。
    • 教你三招让电脑“自废武功”的不错设置方法
    • 批处理自动登录QQ小结及相关讨论
    • cnct.batch 批处理不错的东西%cd%
    • 使用BAT批处理在RAR压缩文件中批量添加文件的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有