我有一个用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)。由你决定。 :)

最佳答案

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

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

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

08-26 00:28