for 语句从入门到精通
作者 佚名
来源 批处理
浏览
发布时间 2013-07-09
cho off for /f %%i in (test 1.txt) do echo %%i pause 你兴冲冲地双击批处理,运行后,屏幕上出现了可耻的报错信息:系统找不到文件 test 。 当你把 test 1.txt 换成 test&1.txt 后,更怪异的事情发生了:CMD窗口在你眼前一闪而过,然后,优雅地消失了。 你可能觉得自己的代码写错了某些符号,你再仔细的检查了一次,确认没有笔误,然后,你再次双击批处理,结果问题照旧;你开始怀疑其他程序对它可能有影响,于是关掉其他窗口,再运行了一次,问题依旧;你不服气地连续运行了好几次,还是同样的结果。 怪哉! 你一拍大腿,猛然想起了一件事:当路径中含有特殊字符的时候,应该使用引号把路径括起来。对,就是它了! 但是,当你把代码写出来之后,你很快就焉了:for /f %%i in ("test 1.txt") do echo %%i,这不就是上面提到的第3条 for /f 命令的格式吗?批处理会把 test 1.txt 这个文件名识别为字符串啊! 你百无聊赖地在CMD窗口中输入 for /? ,并重重地敲下了回车,漫无目的地在帮助信息中寻找,希望能找到点什么。 结果还真让你到了点什么。 你看到了这样的描述: usebackq - 指定新语法已在下类情况中使用: 在作为命令执行一个后引号的字符串并且一个单 引号字符为文字字符串命令并允许在 filenameset 中使用双引号扩起文件名称。 但是,通读一遍之后,你却如坠五里雾中,不知所云。 还好,下面有个例子,并配有简单的说明: FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i 会枚举当前环境中的环境变量名称。 你仔细对比了for /f语句使用usebackq和不使用usebackq时在写法上的差别,很快就找到了答案:当使用了usebackq之后,如果第一个括号中是一条命令语句,那么,就要把单引号''改成后引号`(键盘左上角esc键下面的那个按键,与~在同一键位上)。 回过头去再看那段关于usebackq的描述,字斟句酌,反复揣摩,终于被你破译了天机:usebackq 是一个增强型参数,当使用了这个参数之后,原来的for语句中第一个括号内的写法要做如下变动:如果第一个括号里的对象是一条命令语句的话,原来的单引号''要改为后引号`;如果第一个括号里的对象是字符串的话,原来的双引号"要改为单引号'';如果第一个括号里的对象是文件名的话,要用双引号"括起来。 验证一下,把[code17]改写成如下代码: [code18] @echo off for /f "usebackqu" %%i in ("test 1.txt") do echo %%i pause 测试通过! 此时,你很可能会仰天长叹:Shit,微软这该死的机器翻译! 至于把[code17]代码中的空格换成&后,CMD窗口会直接退出,那是因为&是复合语句的连接符,CMD在预处理的时候,会优先把&前后两部分作为两条语句来解析,而不是大家想象中的一条完整的for语句,从而产生了严重的语法错误。因为牵涉到预处理机制问题,不属于本节要讨论的内容,在此不做详细讲解。 这个时候,我们会吃惊地发现,区区一条for语句,竟然有多达6种句型: 1、for /f %%i in (文件名) do (……) 2、for /f %%i in (''命令语句'') do (……) 3、for /f %%i in ("字符串") do (……) 4、for /f "usebackq" %%i in ("文件名") do (……) 5、for /f "usebackq" %%i in (`命令语句`) do (……) 6、for /f "usebackq" %%i in (''字符串'') do (……) 其中,4、5、6由1、2、3发展而来,他们有这样的对应关系:1-->4、2-->5、3-->6。 好在后3种情形并不常用,所以,牢牢掌握好前三种句型的适用情形就可以了,否则,要在这么多句型中确定选择哪一条语句来使用,还真有点让人头脑发懵。 至于 for /f 为什么要增加usebacq参数,我只为第4条语句找到了合 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于for 语句从入门到精通的所有评论