如何捕获" pnputil.exe -e"的输出

时间:2020-03-05 18:50:51  来源:igfitidea点击:

如何捕获"%windir%/ system32 / pnputil.exe -e"的输出?
(假设Windows Vista为32位)

关于为什么应用程序通常将输出写入cmd shell的技术解释的奖励,但是当stdout和/或者stderr被重定向时,应用程序什么也不写入控制台或者stdout / stderr?

C:\Windows\System32>PnPutil.exe --help
Microsoft PnP Utility {...}

C:\Windows\System32>pnputil -e > c:\foo.txt

C:\Windows\System32>type c:\foo.txt

C:\Windows\System32>dir c:\foo.txt
 Volume in drive C has no label.
 Volume Serial Number is XXXX-XXXX

 Directory of c:\

09/10/2008  12:10 PM                 0 foo.txt
               1 File(s)              0 bytes

解决方案

回答

编写了一些应用程序,使其能够很好地在管道方案中正常工作,例如

svn status | find "? "

是将" svn status"的输出通过管道传递给" find"?"`的命令,这样它将把Subversion输出过滤到我的存储库中的未知文件(带有问号)。

试想一下,如果svn status还会输出标有" Copyright?2009"的标头,那么该标头行也会显示出来。这不是我所期望的。

因此,某些工具(例如Sysinternals的工具)仅在直接将其打印到命令窗口时才写入任何标题信息,如果检测到任何类型的重定向,则由于上述原因,这些标题信息将不会被写入。

标头信息在管道/自动化方案中使用时会变得杂乱无章。

我想如果我们不能使用>输出到文件,那是因为该工具被硬连接了。我们将需要一种间接的方式来捕获它。

希望这可以帮助。

回答

正如问题中提到的那样,但没有明确指出," pnputil -e 2> c:\ foo.txt"也没有预期的结果。这不会将任何内容定向到文件中,但会将输出发送到控制台。

回答

只有两个输出流。如果"> c:\ foo.txt"不起作用,并且" 2> C:\ foo.txt"不起作用,则没有任何输出。

我们可以将标准错误合并到标准输出(2>&1)中,以便所有输出均通过标准输出:

pnputil -e 1> c:\ foo.txt 2>&1

如果那没有向foo.txt输出任何内容,则pnputil必须正在检测重定向并停止输出。

回答

我想我找到了为什么会这样的技术答案。 MSDN页面上的WriteConsole说,将标准输出重定向到文件会导致WriteConsole失败,应改用WriteFile。调试器确认pnputil.exe确实调用了kernel32!WriteConsoleW和kernel32!WriteConsoleInputW。

嗯,我应该把这作为两个独立的问题来问。

我仍在寻找有关如何从此命令中抓取输出的答案。接受的答案将是回答问题的这一部分的答案。

回答

似乎根本没有一种简单的方法。我们将必须开始挂接到对WriteConsole的调用并转储字符串缓冲区。参见这篇文章进行类似的讨论。

当然,如果要一次性使用该功能,则只需从命令窗口中选择所有输出,然后将其复制到剪贴板即可。 (确保cmd窗口缓冲区足够大以存储所有输出)。

回答

我们可能已经尝试过Windows的Expect来做这种事情,它会告诉工具有一个控制台,并为我们挂接WriteConsole调用。
期待Windows

回答

单击系统菜单图标(左上角->属性->布局)

更改屏幕缓冲区的大小

cls

pnputil -e

;-P