Board logo

标题: [文本处理] [已解决]批处理命令echo后面怎么接管道? [打印本页]

作者: tigerpower    时间: 2015-7-6 21:19     标题: [已解决]批处理命令echo后面怎么接管道?

本帖最后由 tigerpower 于 2015-7-7 17:02 编辑
  1. echo ^<* A *^> | findstr A
复制代码
为什么说命令语法错误
作者: pcl_test    时间: 2015-7-6 21:38

  1. echo ^^^<* A *^^^> | findstr "A"
复制代码

作者: tigerpower    时间: 2015-7-6 23:08

能阐述一下原理吗,为什么要要转义两次?
作者: CrLf    时间: 2015-7-6 23:32

本帖最后由 CrLf 于 2015-7-6 23:36 编辑

回复 3# tigerpower


    http://bbs.bathome.net/viewthrea ... amp;page=1#pid83430
按我的理解来说就是:管道前后存在语句块或者内部命令时,必然启动一个子进程来进行解析,所以要转义两次。
  1. echo ^^^<* A *^^^> | findstr "A"
复制代码
的行为类似于
  1. >管道.txt  cmd /c echo ^^^<* A *^^^>
  2. <管道.txt  findstr "A"
复制代码

作者: tigerpower    时间: 2015-7-7 10:12

本帖最后由 tigerpower 于 2015-7-10 18:34 编辑

总结一下
  1. @echo off
  2. echo ^<* A *^>                                       %= echo         =%
  3. echo ^^^<* A *^^^> | findstr A                       %= echo + |     =%
  4. cmd /c exit 65 & echo ^<* %=exitcodeascii% *^>       %= int -> ascii =%
  5. exit|%ComSPec% /k prompt $L*$SA$S*$G | findstr A     %= prompt       =%
  6. set/p"=<* A *>"<nul | findstr A                      %= set          =%
  7. mawk "BEGIN{print\"^<* A *^>\"}" | findstr A         %= awk          =%
  8. echo ^^^<* A *^^^> | sed -n "/<.*>/p"                %= sed          =%
  9. printf "<* A *>" | findstr A                         %= printf       =%
复制代码
外部命令^用法也不太一样,我晕了,看来只有强记
作者: CrLf    时间: 2015-7-7 17:28

本帖最后由 CrLf 于 2015-7-7 17:30 编辑

回复 5# tigerpower


    不会很复杂,记住几个规则就好了:
1、匿名管道至少需要同时开启前后两个进程来对接,一个负责输出,一个负责输入
2、内部命令必须要有 cmd /c 来执行
3、由 ()、&、| 形成的代码块必须由 cmd /c 来执行,而且会合并成一行
4、for /f %%a in ('[Command]') do 中调用的 [Command] 必须由 cmd /c 来执行
5、其他情况下,单独出现的外部命令不需要产生新的 cmd 进程

这就是为什么这两条是等价的
  1. echo haha ^& echo what | findstr /n .
  2. (echo haha & echo what)| findstr /n .
复制代码
以及为什么这样也能执行,其实就是用 & 连成了一行
  1. (
  2. echo a=test
  3. pause
  4. )|more
复制代码

作者: tigerpower    时间: 2015-7-7 22:14

原来()内的代码和不带括号的代码行为是不一样的




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