ImageVerifierCode 换一换
格式:DOC , 页数:14 ,大小:77KB ,
资源ID:7365319      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7365319.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(批处理FOR命令简析.doc)为本站会员(ysd1539)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

批处理FOR命令简析.doc

1、整理延迟变量扩展介绍补充引用变量的值在批处理中习惯叫变量扩展。使用一对百分号括起变量名(如:%VAR%)的形式表示变量扩展。延迟引用变量的值叫延迟变量扩展。使用一对感叹号括起变量名(如:!VAR!)的形式表示延迟变量扩展。是指变量扩展这个动作被推迟。有了变量扩展。为什么又多出一个延迟变量扩展呢?先看下面程序片段 1:set VAR=beforeif “%VAR%“ = “before“ (set VAR=afterecho %VAR%)运行结果是什么?结果是:before而正确逻辑结果应是:after为什么会发生这样的事呢?原来命令解释程序(cmd)在执行复合语句之前做了预处理,即读入复合语句

2、时做了变量扩展。对于程序片段 1,命令解释程序读入 if 复合语句,接着做 VAR 变量扩展,由于此时 set VAR=after 语句还没有执行,VAR 变量的值未被改变仍然是 before,因此,%VAR%扩展为 before , echo %VAR%语句变为 echo before 。然后,命令解释程序从 if 语句的开头开始执行,很明显改变 VAR 变量的值对 echo before 语句没有影响(因%VAR%已提前扩展为before) ,执行结果是 before 。扩展后的程序片段 1:set VAR=beforeif “ before “ = “before“ (set VAR=a

3、fterecho before)再看一个程序片段 2:(给当前目录文件列表的每行加上序号)set count=0for %i in (*) do (set /a count += 1echo %count% %i)运行结果:所有序号都是 0不是正确的逻辑结果。原因与程序片段 1 一样。命令解释程序读入 for 复合语句,接着做 count 变量扩展,由于此时 set /a count += 1 语句还没有执行,count 变量的值未被改变仍然是 0,因此,%count%扩展为 0 ,echo %count% %i 语句变为 echo 0 %i 。然后,命令解释程序从 for 语句的开头开始执行

4、,很明显改变 count变量的值对 echo 0 %i 语句没有影响(因%count%已提前扩展为 0) ,执行结果的序号是 0 。扩展后的程序片段 2:set count=0for %i in (*) do (set /a count += 1echo 0 %i)为了解决以上问题,命令解释程序增加了在运行时才进行变量扩展的功能-“延迟变量扩展“。即引入延迟变量扩展的表示形式(使用一对感叹号括起变量名,如:!VAR!) ,这里简称它为“延迟变量扩展表示式“。命令解释程序在读入语句时,遇到“延迟变量扩展表示式 “,对表示式中的变量不做变量扩展,而推迟到在执行时才做变量扩展。因此,在 if、els

5、e、for 和用“并揭示其中的一些现象;例一:CODE: Copy to clipboard-echo offset “var=kljlk!tsd!21%mk%gd“set var结果为Quote: var=kljlk!tsd!21gd (注意到 此时 setlocal 默认为 disabledelayedexpansion !不被识别)因此把%mk%看做环境变量被替换掉; 而 mk 没有被定义因此 %mk%被替换为空再来看加了 setlocal enabledelayedexpansion 后会是怎样;例二:CODE: Copy to clipboard-echo off而 tsd 和 mk

6、 没有被定义因此均被替换为空(由于优先级的不同;%mk%将在预处理被先被替换,然后!tsd!被替换; 原因后面有讲到)如果把 kljlk!tsd!21%mk%gd 放到 t.txt 然后再通过%a 做为中介进行传递后会有什么现象呢例三:CODE: Copy to clipboard-echo offfor /f “delims=“ %a in (t.txt) do ( set “var=%a“set var)结果为:Quote: var=kljlk!tsd!21%mk%gd 如果按照上面所说的此时%mk%应该被替换为空;但是这里经过一个%a 的中介 ;此时的结果不会把%mk%替换; 即使 mk

7、 环境变量有定义也不会替换掉;而是按字面输出 ;实际上这跟 cmd 的预处理机制有关;当 CMD 读取 for 语句时,他的所有语句将一同被读取,并完成预处理工作,这其中就包括环境变量%的扩展;因为字符串在文本中 并没有以字符串的形式出现在 for 语句中;因此其中的% 躲过了预处理机制;但是当启用延迟环境变量后例如:例四CODE: Copy to clipboard-echo offfor /f “delims=“ %a in (t.txt) do ( set “var=%a“set var)结果为:Quote: var=kljlk21%mk%gd 首先他会和上面一样对 for 所有语句一起

8、读取;完成对%的扩展;(% 的优先级高)然后当 CMD 读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了例如在 set “var=%a“时 只有执行到这条命令前才会对这条命令进行扩展 ;而此时%a 已经被 kljlk!tsd!21%mk%gd 所代替; 因此将会对其中的 !进行扩展.他会识别其中是否存在!;此时的扩展只处理!而不处理%(因为对%的处理过程在先前已经进行完;而那时因为字符串在文本中 并没有以字符串的形式出现在 for 语句中;因此其中的%躲过了预处理机制;);然而只有当该字符串中含有!时, cmd 才

9、会对该字符串进行再次处理;举例:例五:CODE: Copy to clipboard-echo off(所在行包含!)而第三行的 没有被处理;(所在行不包含!)(包含一个! 也会对 进行处理;)由此可见 启用延迟环境变量后 ;在每次执行语句前;cmd 会检查是否含有!;如果存在就对其进行必要的预处理后再执行.注:此时 setlocal 默认为 disabledelayedexpansion 因此!tsd! 是因为不给识别而不被替换和 %mk%不被替换的原因不同.如果想强迫进行二次转变(即把 %mk%的值按其环境变量值警醒替换 )再赋值给 var 可以使用 call set “var=%a“也就

10、是说:例六:CODE: Copy to clipboard-echo offset “mk=152“for /f “delims=“ %a in (t.txt) do ( call set “var=%a“set var)的结果则为:Quote: var=kljlk!tsd!21152gd call set “var=%a“实际上是让命令解释器再来一次预处理来达到目的的再来看%a 另一个例子例七:CODE: Copy to clipboard-echo offecho 但是看下面的例子;把用%a 做为中介后:例七:CODE: Copy to clipboard-echo offfor /f “

11、delims=“ %a in (t.txt) do ( echo.%a)结果则为:Quote: 丝毫没有因为特殊字符而受影响 ;(原因上面已讲到)注:如果 t.txt 中有直接回车的空行则会跳过; 原因在 for 本身而不是 %a;再来个!var!的特殊例子例八:CODE: Copy to clipboard-echo offset “var=但是此种方法仍然受上面所述的原因影响;比如如果 var=后面的值含有 !和%等则会发生替换; 还有比如中间有:则会与 set 发生关系而导致结果不准确;当然可以利用%a 中介可以避免 % 被替换; 但是! 却有上述原因没法逃过被替换;最后给出个综合应用的

12、例子:对文件指定行进行输出;不论是否含有特殊字符 :这里就把整个文件输出;对指定行可以修改为 findstr /n .* test.txt|findstr “10:“ 等;CODE: Copy to clipboard-echo offfor /f “delims=“ %a in (findstr /n .* test.txt) do (set “var=%a“setlocal enabledelayedexpansionset var=!var:*:=!echo.!var!endlocal)短短的几行代码包含了很多技巧;测试文本:test.txtQuote: “aou“eo;euou%:aeui:E2uo alejou 3nulege#6758!79098!98%$诸位帮忙测试 ;

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报