标题: [原创] [批处理命令一日一教学 续](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的所有文件、文件夹”。- dir /s /b /a | find ".txt"
复制代码
.
一些需要管道符(|)的情况:
1.将当前日期放在剪贴板中。复制代码
.
2.查找特定的字符串或文件或文件夹
这个功能要实现的完美,需要熟悉掌握findstr和for,而在findstr和for同时使用的时候,管道符(|)是不可或缺的。
作者: ivor 时间: 2012-2-7 19:19
- CLIP
-
- 描述:
- 将命令行工具的输出重定向到 Windows 剪贴板。这个文本输出可以被粘贴
- 到其他程序中。
-
- 参数列表:
- /? 显示此帮助消息。
-
- 示例:
- DIR | CLIP 将一份当前目录列表的副本放入 Windows 剪贴板。
-
- 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)到后一个命令。- echo 12345 >nul | more
- cd \\\ |more >1.txt
复制代码
第一句什么也不会显示,因为echo命令的标准输出会被优先重定向到nul,more命令不会得到任何信息。
第二句1.txt也是空的,因为cd命令的出错信息是句柄2输出的,句柄2的信息不会被管道传递。
我在5#的例子就是这个意思,居然没有人讨论~
作者: find 时间: 2012-2-12 19:30
回复 12# applba 复制代码
这个该如何讨论呢?
作者: 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的内容:- dirrrr 1>&2 | more
- 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是假的吧?- dirrrr 1>&2 | findstr "dirrr"
复制代码
作者: abghost 时间: 2012-5-10 17:40
回复 find
dirrrr的句柄1本来就不会产生任何信息。
2>&1,或者2
applba 发表于 2012-2-12 21:10
学习了
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |