如何捕获" pnputil.exe -e"的输出
如何捕获"%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