收藏 分享(赏)

批处理FOR命令简析.doc

上传人:ysd1539 文档编号:7365319 上传时间:2019-05-16 格式:DOC 页数:14 大小:77KB
下载 相关 举报
批处理FOR命令简析.doc_第1页
第1页 / 共14页
批处理FOR命令简析.doc_第2页
第2页 / 共14页
批处理FOR命令简析.doc_第3页
第3页 / 共14页
批处理FOR命令简析.doc_第4页
第4页 / 共14页
批处理FOR命令简析.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

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营业执照举报