browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

管道重定向符“|”

Posted by on 2008 年 07 月 27 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

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

命令行输入
  1. type somefile.txt | more  

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

C++代码
  1. // DbgPrint.cpp   
  2.   
  3. #include <Windows.h>   
  4. #include <tchar.h>   
  5.   
  6. int main(void)   
  7. {   
  8.     HANDLE hPipe = GetStdHandle(STD_INPUT_HANDLE);   
  9.   
  10.     CHAR str[1024];   
  11.     DWORD dwRead;   
  12.     BOOL b;   
  13.   
  14.     do  
  15.     {   
  16.         ZeroMemory(str, sizeof(str));   
  17.         b = ReadFile(hPipe, str, sizeof(str), &dwRead, NULL);   
  18.   
  19.         if (b && dwRead > 0)   
  20.             OutputDebugStringA(str);   
  21.     } while (b && dwRead > 0);   
  22.   
  23.     return 0;   
  24. }  

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

命令行输入
  1. 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 ,有兴趣的朋友们可以自己测试一下。

订阅本站

4 Comments

  • At 2008.07.29 19:01, 花好月圆 said:

    more进程真陌生~带入一个名词吧~Uedit~

    小试了一下~uedit居然不支持~
    白打了这么多东西~
    \”C:\\Program Files\\IDM Computer Solutions\\UltraEdit-32\\Uedit32.exe\”

    • At 2008.08.02 20:37, 阿奔 said:

      网站怎么成这样?这么多广告……

      • At 2009.04.21 09:35, 海之蓝 said:

        你好,没有弄明白怎么测试这个程序,也就是怎么在命令行下输入 dir | DbgPrint ,需要先启动 DbgPrint ,还是怎么,尝试了几下都没有任何反映,希望能得到你的帮助,谢谢了。

        • At 2009.04.21 09:47, 李马 said:

          [quote=海之蓝]你好,没有弄明白怎么测试这个程序,也就是怎么在命令行下输入 dir | DbgPrint ,需要先启动 DbgPrint ,还是怎么,尝试了几下都没有任何反映,希望能得到你的帮助,谢谢了。[/quote]
          DbgPrint 只是一个示例程序,它的目的就是将自己标准输入句柄的内容以调试信息的方式输出,用以检测 cmd.exe 下 | 的作用。这些调试信息可以用 sysinternals 的 DebugView 看到。
          当然,如果只是为了检测的话,把这些内容输出到一个文件中也是可以的。

          (Required)
          (Required, will not be published)