【问题标题】:How can I capture the console output of dpinst when running silently?静默运行时如何捕获 dpinst 的控制台输出?
【发布时间】:2015-09-09 16:04:41
【问题描述】:

我有一个进程(用 C# 编写)以管理权限运行并调用 dpinst.exe 来执行自动驱动程序安装。它编写自己的自定义 dpinst.xml 文件来指定诸如禁止 EULA 页面、禁止向导、运行“安静安装”以及在所有子目录中搜索等内容。

当我从命令行手动调用它时(参见下面的示例),它似乎工作正常。由于我使用的命令行开关,它会在控制台中打印一堆 INFO 级别的日志消息。

C:\Path\To\Drivers> dpinst.exe /C /L 0x409

我想记录控制台中打印的内容,所以我的 C# 代码如下所示:

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\Path\To\Drivers\dpinst.exe",
        Arguments = "/C /L 0x409",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        Verb = "runas"
    }
};

string output;
process.Start();

using (var reader = process.StandardOutput)
{
    output = reader.ReadToEnd();
    reader.Close();
}

但是,当我运行该代码时,output 的值始终为空。因此,对于我的下一个实验,我尝试直接使用命令行将输出通过管道传输到文件,如下所示:

C:\Path\To\Drivers> dpinst.exe /C /L 0x409 > test.log 2>&1

这创建了 test.log 文件,但它也是空白的。有趣的是,我仍然可以在同一个控制台窗口中看到 dpinst.exe 生成的所有控制台输出;由于某种原因,它没有被重定向到我指定的文件。因此,无论我如何调用 dpinst 可执行文件,症状都是相同的;它不想重定向输出。我不确定其根本原因是什么,也不知道如何解决。如何捕获控制台输出?

编辑:如果有人想要 dpinst.exe 的副本在本地运行并测试自己,我有 provided one at this link,与我正在使用的 dpinst.xml 文件捆绑在一起。请记住,您需要使用/C 命令行开关调用它才能生成任何命令行输出。或者,如果您偏执并且不想从一些随机的 Stack Overflow 问题下载可执行文件,您可以从 Microsoft 获取 dpinst.exe 实用程序作为 Windows Driver Kit 的一部分。它是免费下载的,但您必须从完整的 WDK ISO(大约 700 MB)中提取实用程序(只有 500 KB)。由你决定。 :)

【问题讨论】:

  • 除了使用日志文件的答案和建议之外,你有没有找到其他方法? msdn 告诉我们应该能够捕获的 wbout 结果代码。成功了吗?

标签: c# command-line redirectstandardoutput dpinst


【解决方案1】:

例如,您的代码可以使用标准工具(如“ping”)完美运行。所以也许出于某种原因 dpinst 改为写入标准错误?您可以设置 RedirectStandardError = true 并阅读 StandardError 以检查是否是这种情况。

更新以防其他人遇到此问题:

似乎 dpinst 不写入标准输出,而是以其他方式将消息记录到控制台。我想到的实现目标的唯一方法是:记住“%SystemRoot%\DPINST.LOG”文件的大小,运行命令,等待退出,然后读取记住的位置和文件结尾之间的所有内容。这样你就可以得到你的日志了。

【讨论】:

  • 您好,谢谢您的建议。我刚试了一下,可惜也没用。
  • 但是,相同的代码是否适用于 FileName="ping" 和 Arguments="google.com" ?
  • 是的,当我调用 ping 时,相同的代码确实有效。我从Pinging google.com... 一直到Approximate round trip... 得到整个输出
  • 好吧,似乎 dpinst 不写入标准输出,而是以其他方式将消息记录到控制台。我想到的实现目标的唯一方法是:记住“%SystemRoot%\DPINST.LOG”文件的大小,运行命令,等待退出,然后读取记住的位置和文件结尾之间的所有内容。这样你就可以得到你的日志
【解决方案2】:

我的回答会帮助其他人。当您运行 Dpinst.exe 并添加 swicth /C 以将日志转储到控制台时,它还会在此目录“C:\Windows\DPINST.LOG

中创建一个日志文件

你可以在那里找到日志文件..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2011-10-31
    • 2010-11-08
    • 2013-07-28
    相关资源
    最近更新 更多