如何在静默运行时捕获dpinst的控制台输出?

时间:2015-09-09 16:04:41

标签: c# command-line redirectstandardoutput dpinst

我有一个以管理权限运行的进程(用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问题下载可执行文件,则可以将dpinst.exe实用程序作为Microsoft Windows Driver Kit的一部分。它是免费下载的,但你必须从完整的WDK ISO(大约700 MB)中提取实用程序(只有500 KB)。由你决定。 :)

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

中创建一个日志文件。

您可以在此处找到日志文件。