管道重定向符“|”

CMD管道与标准输入句柄

原文链接:http://www.titilima.cn/show-259-1.html

在 cmd.exe 的命令行模式下,管道重定向符“|”用于把一个命令的输出传递给另一个程序,比如,在查看一个比较长的文件时,需要把 type 命令的结果分页显示,这时候就需要把它重定向到 more 命令,如:

type somefile.txt | more

管道重定向符“|”的实质作用是把 type 的输出结果发送给 more 进程的标准输入句柄(STD_INPUT_HANDLE),more 进程则不断读取这个句柄的内容,并将读出的内容计算后分页输出。

下面的示例代码 DbgPrint 示范了如何使用 STD_INPUT_HANDLE。

  1. //DbgPrint.cpp
  2. #include<Windows.h>
  3. #include<tchar.h>
  4. intmain(void)
  5. {
  6. HANDLEhPipe=GetStdHandle(STD_INPUT_HANDLE);
  7. CHARstr[1024];
  8. DWORDdwRead;
  9. BOOLb;
  10. do
  11. {
  12. ZeroMemory(str,sizeof(str));
  13. b=ReadFile(hPipe,str,sizeof(str),&dwRead,NULL);
  14. if(b&&dwRead>0)
  15. OutputDebugStringA(str);
  16. }while(b&&dwRead>0);
  17. return0;
  18. }

代码编译完成后,可以在命令行中输入:

dir | DbgPrint

这样将会使 dir 的结果重定向到 DbgPrint 的标准输入句柄中,也就是由 OutputDebugStringA 来输出。下图是由 DebugView 所捕获的调试信息,也就是dir的输出。

最后说一句,最初我尝试在 do-while 中使用 ReadConsoleA 来获取管道输出,但是什么也得不到,而 ReadFile 则工作正常。查了一下 MSDN ,其中对 GetStdHandle 的解释有这么一句:

These handles can be used by the ReadFile and WriteFile functions, or by any of the console functions that access the console input buffer or a screen buffer (for example, the ReadConsoleInput, WriteConsole, or GetConsoleScreenBufferInfo functions).

如此看来,由 GetStdHandle 返回的句柄应该是不支持 ReadConsole 的。不过,我并没有再测试 ReadConsoleInput ,有兴趣的朋友们可以自己测试一下。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值