[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理命令echo后面怎么接管道?

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

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

评分人数

TOP

能阐述一下原理吗,为什么要要转义两次?

TOP

本帖最后由 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"
复制代码
1

评分人数

TOP

本帖最后由 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       =%
复制代码
外部命令^用法也不太一样,我晕了,看来只有强记

TOP

本帖最后由 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
复制代码
1

评分人数

TOP

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

TOP

返回列表