Board logo

标题: [文本处理] [已解决]批处理for中set集的命令带有转义字符怎么理解? [打印本页]

作者: abcdshenji    时间: 2011-4-20 20:48     标题: [已解决]批处理for中set集的命令带有转义字符怎么理解?

本帖最后由 abcdshenji 于 2011-4-21 12:25 编辑

就是这句:
  1. for /f "skip=1 delims=" %%k in ('wmic cpu get caption^|findstr /i "."') do echo 描述: %%k
复制代码
|为什么前面要加^?不加的话就运行不了,但是单独
  1. wmic cpu get caption|findstr /i "."
复制代码
就可以,为什么?难道说set集中的命令在预处理的时候改变了什么?这个过程是怎样的不理解。。。
作者: hanyeguxing    时间: 2011-4-20 21:12

本帖最后由 hanyeguxing 于 2011-4-20 21:37 编辑

测试代码:
  1. @Tasklist /nh /fi "Imagename eq cmd.exe"
  2. @echo;分隔
  3. for /f "delims=" %%k in ('Tasklist^|find /i "cmd.exe"') do @echo;%%k
  4. @echo off
  5. echo;分隔
  6. Tasklist /nh /fi "Imagename eq cmd.exe"
  7. pause
复制代码
输出结果:
  1. cmd.exe                     2436 Console                 0      1,836 K
  2. 分隔
  3. D:\>for /f "delims=" %k in ('Tasklist|find /i "cmd.exe"') do @echo;%k
  4. cmd.exe                     2436 Console                 0      1,876 K
  5. cmd.exe                     3204 Console                 0      2,896 K
  6. 分隔
  7. cmd.exe                     2436 Console                 0      1,892 K
  8. 请按任意键继续. . .
复制代码
| 前不加 ^ ,他在预处理时就是管道符,于是他分隔了 for 语句,语法错误
加了前缀 ^ ,在预处理时就是普通字符,同时 ^ 被脱去,再开新解释器时他才成为管道
作者: Batcher    时间: 2011-4-20 22:13

批处理for命令中的管道符为何要用尖号^进行转义?
http://bbs.bathome.net/viewthread.php?tid=1290&page=2#pid6306
作者: abcdshenji    时间: 2011-4-20 22:28

  1. 加了前缀 ^ ,在预处理时就是普通字符,同时 ^ 被脱去,再开新解释器时他才成为管道
复制代码
这句让我明白了一点,可是问题又来了:
  1. set a=^^^>
  2. echo %a%
复制代码
结果是">",多几个^或者少几个^都会执行失败
  1. echo ^^^>
复制代码
结果是"^>",当^个数是奇数是执行成功,偶数是执行失败

这是为啥?到底预处理时候脱几个^,执行的时候又脱几个^??
作者: Batcher    时间: 2011-4-20 22:33

4# abcdshenji


http://bbs.bathome.net/thread-3349-1-1.html
作者: hanyeguxing    时间: 2011-4-20 23:01

本帖最后由 hanyeguxing 于 2011-4-21 08:01 编辑

2楼代码演示for语句是如何预处理、如果新开解释器处理set集命令、如何脱字符的,怎么没看明白捏?
前一个字符是^,就会转义后一个字符,即使后一个字符是^,后面这个就成了普通字符而非转义符;同时脱去前一个^,只显示第二个字符。
多个字符时也是如此递推
>也是敏感字符,即重定向输出符号,如果前不加^就是输出的意思,那么必须告诉他输出到哪
echo;^^^^^>
第一个^转义第二个^,第三个^转义第四个^,第五个^转义第一个>,结果显示第二个^、第四个^和>
echo;^^^^>
此时>没被转义,就是输出的意思,那输出到哪啊?语法错误!~
作者: abcdshenji    时间: 2011-4-21 12:24

2楼的代码我能看明白,我的意思是看完后又另外引出^用法的问题,不过现在我明白了,你解释的很清楚:

echo;^^^^^>
第一个^转义第二个^,第三个^转义第四个^,第五个^转义第一个>,结果显示第二个^、第四个^和>
echo;^^^^>
此时>没被转义,就是输出的意思,那输出到哪啊?语法错误!~

谢谢hanyeguxing大大!
作者: CrLf    时间: 2011-4-21 12:57

批处理的预处理是从上而下、从左到右的,所以echo;^^^^>这句会出错是因为实际执行的时候是 echo 【^】【^】>,此时>未转义,被cmd当成重定向符号,当然会出错。
作者: Hello123World    时间: 2011-4-21 13:04

4# abcdshenji
  1. set a=^^^>
  2. echo %a%
  3. 复制代码结果是">"
  4. echo ^^^>
  5. 复制代码结果是"^>",
复制代码
问:为什么同样是^^^>得出的结果却不同?
答:第一个结果是">",因为a的值为^>,echo ^>再次执行得到结果>
      第二个结果是"^>",因为直接(已经转义了)echo ^>
相当于第一个代码转义了两个回合。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2