批处理FOR命令简析.docVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
批处理FOR命令简析.doc

整理延迟变量扩展介绍补充 引用变量的值在批处理中习惯叫变量扩展。 使用一对百分号括起变量名(如:%VAR%)的形式表示变量扩展。 延迟引用变量的值叫延迟变量扩展。 使用一对感叹号括起变量名(如:!VAR!)的形式表示延迟变量扩展。 是指变量扩展这个动作被推迟。 有了变量扩展。为什么又多出一个延迟变量扩展呢? 先看下面程序片段1: set VAR=before if %VAR% == before ( set VAR=after echo %VAR% ) 运行结果是什么? 结果是:before 而正确逻辑结果应是:after 为什么会发生这样的事呢? 原来命令解释程序(cmd)在执行复合语句之前做了预处理,即读入复合语 句时做了变量扩展。对于程序片段1,命令解释程序读入if复合语句,接着 做VAR变量扩展,由于此时set VAR=after语句还没有执行,VAR变量的值 未被改变仍然是before,因此,%VAR%扩展为before ,echo %VAR%语句 变为echo before 。然后,命令解释程序从if语句的开头开始执行,很明显 改变VAR变量的值对echo before语句没有影响(因%VAR%已提前扩展为 before),执行结果是before 。 扩展后的程序片段1: set VAR=before if before == before ( set VAR=after echo before ) 再看一个程序片段2:(给当前目录文件列表的每行加上序号) set count=0 for %%i in (*) do ( set /a count += 1 echo %count% %%i ) 运行结果:所有序号都是0 不是正确的逻辑结果。 原因与程序片段1一样。命令解释程序读入for复合语句,接着做count变 量扩展,由于此时set /a count += 1语句还没有执行,count变量的值未被改 变仍然是0,因此,%count%扩展为0 ,echo %count% %%i语句变为echo 0 %%i 。然后,命令解释程序从for语句的开头开始执行,很明显改变count 变量的值对echo 0 %%i语句没有影响(因%count%已提前扩展为0),执行 结果的序号是0 。 扩展后的程序片段2: set count=0 for %%i in (*) do ( set /a count += 1 echo 0 %%i ) 为了解决以上问题,命令解释程序增加了在运行时才进行变量扩展的功能 --延迟变量扩展。即引入延迟变量扩展的表示形式(使用一对感叹号括起 变量名,如:!VAR!),这里简称它为延迟变量扩展表示式。命令解释程序 在读入语句时,遇到延迟变量扩展表示式,对表示式中的变量不做变量扩 展,而推迟到在执行时才做变量扩展。因此,在if、else、for和用 | ||等连接起来的复合语句中,如果在变量扩展前变量的值发生了变化,就 要将变量扩展改为延迟变量扩展,令变量扩展在执行时才进行,从而得到变 化了的变量值。 因此,要将以上程序片段中变量扩展改为延迟变量扩展,修改后的程序片段: set VAR=before if !VAR! == before ( set VAR=after echo !VAR! ) set count=0 for %%i in (*) do ( set /a count += 1 echo !count! %%i ) 但是,默认情况下,延迟变量扩展功能是停用的。 启用这项功能,有几种方法: 1. 运行cmd /v: on 进入命令提示符窗口,然后输入命令。 2. 直接运行cmd /v: on /c commands 3. 在批处理文件里使用这项功能之前设置:setlocal enabledelayedexpansion 4. 设置注册表,让cmd默认情况下启用这项功能,可参考命令:cmd/? 总结以上要点,将程序片段2完善后,得到以下批处理程序—myDir.bat: :: 给当前目录文件列表的每行加上序号 @echo off setlocal enabledelayedexpansion set count=0 for %%i in (*) do ( set /a count += 1 echo !count! %%i ) 运行程序,结果正确。 如果不想为何时使用延迟变量扩展而烦恼,可以一开始就使用延迟变量扩展, 替代变量扩展。但是,迟变量扩展的自身嵌套或者和变量扩展相互嵌套使用, 也存在问题。 另外,对于延迟变量扩展问题,有另一巧妙的解决方法(叫call方法),将 call命令放在需要延迟变量扩展的语

文档评论(0)

zzqky + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档