Board logo

标题: [原创] [批处理命令一日一教学 续](50)管道符号:| [打印本页]

作者: Hello123World    时间: 2012-2-7 18:55     标题: [批处理命令一日一教学 续](50)管道符号:|

【原】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-2576-1-1.html
【续】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-13798-1-1.html


管道符(|)的作用是将符号前的命令输出,当做符号后命令的输入。

例如:
有两条命令,“dir /s /b /a”和“ find ".txt"”,第一条显示当前文件夹中的所有文件、文件夹,第二条是查找含有字符“.txt”的字符串。

两条命令用管道符(|)连接就可以“查找当前文件夹中含有.txt的所有文件、文件夹”。
  1. dir /s /b /a | find ".txt"
复制代码
.


一些需要管道符(|)的情况:

1.将当前日期放在剪贴板中。
  1. echo %date:~,10%|clip
复制代码
.


2.查找特定的字符串或文件或文件夹
这个功能要实现的完美,需要熟悉掌握findstr和for,而在findstr和for同时使用的时候,管道符(|)是不可或缺的。
作者: ivor    时间: 2012-2-7 19:19

  1. CLIP
  2. 描述:
  3.     将命令行工具的输出重定向到 Windows 剪贴板。这个文本输出可以被粘贴
  4.     到其他程序中。
  5. 参数列表:
  6.     /?                  显示此帮助消息。
  7. 示例:
  8.     DIR | CLIP          将一份当前目录列表的副本放入 Windows 剪贴板。
  9.     CLIP < README.TXT   将 readme.txt 的一份文本放入 Windows 剪贴板。
复制代码

作者: CrLf    时间: 2012-2-7 20:03

管道符(|)的作用是将符号前的命令输出,当做符号后命令的输入。

这一句并不准确,因为管道必须产生至少两个子进程,内部命令和转义的连接符将启用 cmd.exe 来解释执行,所以更严谨的说法也许是:
管道符(|)的作用是将符号前的进程输出,当做符号后进程的输入。

作者: xslxslxsl    时间: 2012-2-7 22:14

原来还有这个CLIP啊,学到了一些
作者: applba    时间: 2012-2-8 00:02

举个例子:
dir 你好 |more
作者: Hello123World    时间: 2012-2-8 12:29

回复 3# CrLf


    如果管道前和管道后都是内部命令,也会产生两个子进程吗?
作者: Demon    时间: 2012-2-8 13:02

回复  CrLf


    如果管道前和管道后都是内部命令,也会产生两个子进程吗?
Hello123World 发表于 2012-2-8 12:29



作者: cjiabing    时间: 2012-2-8 14:59

你这个可以和49那个帖合并一起了,都是管道连接符号。
作者: Hello123World    时间: 2012-2-8 16:39

回复 7# Demon


    可为什么运行
echo hello | find "h"

只有一个cmd.exe.
作者: Hello123World    时间: 2012-2-8 16:46

回复 8# cjiabing


    还是那句话“萧规曹随”,如果要改的话,其实还有很多,比如可以添加clip、rasdial等命令,但是我本来就是冲着namejm的帖子来的,他完成知识结构,我帮忙做他没有做完的内容。
作者: Batcher    时间: 2012-2-10 14:15

回复 8# cjiabing


哪本书上说&、&&、||是管道?我一直很好奇为啥很多人这样说
作者: applba    时间: 2012-2-12 10:14

其实进程的多少无所谓~
管道,用于连接一个命令的输出句柄(句柄1)和另一个命令的输入句柄(句柄0)。
注意:
管道只传递前一个命令的标准输出(句柄1)到后一个命令;
管道并不传递前一个命令的错误输出(句柄2)到后一个命令。
  1. echo 12345 >nul | more
  2. cd  \\\ |more >1.txt
复制代码
第一句什么也不会显示,因为echo命令的标准输出会被优先重定向到nul,more命令不会得到任何信息。
第二句1.txt也是空的,因为cd命令的出错信息是句柄2输出的,句柄2的信息不会被管道传递。

我在5#的例子就是这个意思,居然没有人讨论~
作者: find    时间: 2012-2-12 19:30

回复 12# applba
  1. dirrrr 2>&1 | more
复制代码
这个该如何讨论呢?
作者: cjiabing    时间: 2012-2-12 21:02

回复 11# Batcher


      不会是我误导的吧?最近状态不好,表达不严谨,老说错话做错事。
      其实我的意思是管道符和连接符,换个角度说,&、&&、|、||这些符号都有一个共同的特性,就是它们都能将两个命令连接起来,或表示并联,或表示串联:
      &   连接符号,表示连接两个命令,此两个命令之间缺乏必要的关联,前后两个命令可以各独立成行;命令按横向顺序执行。如:@echo off&echo Yes&pause&exit,这样做的意义就是在FOR等命令当中能够实现用一行来执行多行的命令。
      &&   表示连接两个命令,此两个命令之间存在先后顺序,即前一个命令执行成功后再执行后一个命令,没有前一命令执行结果(成功与否)反馈后一个命令就无法执行;命令不能分开执行,否则达不到原有功能和目的。打个比方,如果你点燃导火线(前一命令),鞭炮就会响(后一命令),而只要你点燃它肯定会响。&&的判断标准应该是类似于返回码之类的方式,也就是,你可以将&&语句改成:echo Yes&IF %ERRORLEVEL% == 0 echo 执行成功&pause。但我对返回码认识比较迷糊,可能只要命令执行了而不管有无结果返回码都算是0,似乎没有&&那么精确和方便。
      |    传说中的管道符号,表示连接两个命令,并将前一个命令执行结果传输给后一个命令,理论上类似于单个FOR的执行过程;这两个命令存在先后关系,可以同时运行,但没有前一命令的结果后一命令就会发生错误。管道符|类似于接力赛上的接力棒,它从一个运动员的手上传递给下一个运动员的手上。如:dir|find /i "dir"
      ||    仍然是管道符,表示连接两个命令,它将上一命令结果传输给下一命令执行,但它传输的是一种执行状态(成功与否),而不是或不仅仅是执行结果;性质上几乎与&&一模一样,只是功能上恰好相反,它表示上一命令执行失败后执行后一命令,如果不失败则不执行。如:echooo ooo||echo Bad。  或:echo ooo>nul 2>nul||echo Bad。
      由以上可知,真正的管道符号是|,它真正传输了前一命令的结果到后一命令执行,这样就不必使用临时文件、临时变量了。如果||也算是管道符号,那么&&也应该算是,它们都会将前一命令的执行状态(返回码)传输给后一命令,以此决定后一命令是否执行。实际上在使用中我们都将两者放在同一参考位置上。真正在连接前后命令时没有像前三者一样向后一命令传递信息(执行状态和执行结果)的可能只有&。
      以上说的执行状态,是指命令执行是否成功这一状态信息;执行结果,是指命令执行后获得的结果信息。
      简单滴说:
      &——将两个命令连接起来一起执行,各自独立。
      |——将前面命令执行结果传递给后面命令,血肉相连。传输执行结果。
      &&——如果前面命令执行成功,则执行后面命令,否则不执行。传输执行状态。
      ||——如果前面命令执行失败,则执行后面命令,否则不执行。传输执行状态。
作者: applba    时间: 2012-2-12 21:10

回复 13# find


    dirrrr的句柄1本来就不会产生任何信息。
    2>&1,或者2<&1,都表示句柄2复制句柄1的方向,此时句柄2指向的句柄1中的con,而句柄1依然是无内容的。
(不要理解成把句柄2中的内容写入句柄1,然后句柄1就有了句柄2 的内容!)
   1<&2,或1>&2,表示句柄1复制句柄2 的方向,句柄1此时指向句柄2 的con,这时的句柄1是有内容的。

下面的命令是可以显示句柄2的内容:
  1. dirrrr 1>&2 | more
  2. dirrrr 1<&2 | more
复制代码

作者: applba    时间: 2012-2-12 21:30

回复 9# Hello123World

一个是cmd.exe,另一个是find.exe
作者: 迷彩的SF    时间: 2012-2-12 23:01

echo y | set /p a=       echo %a%为什么显示:echo处于…呢?一位前辈说|是将一个进程的输出一>另一个进程,这里显示不了是因为echo与set都只有一个进程Cmd.exe吗?
作者: find    时间: 2012-2-13 09:58

回复 15# applba


那个more是假的吧?
  1. dirrrr 1>&2 | findstr "dirrr"
复制代码

作者: abghost    时间: 2012-5-10 17:40

回复  find


    dirrrr的句柄1本来就不会产生任何信息。
    2>&1,或者2
applba 发表于 2012-2-12 21:10



    学习了




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