我有一个进程(用C#编写),它以管理权限运行,并调用dpinst.exe来执行自动驱动程序安装。它编写自己的自定义dpinst.xml文件来指定诸如关闭EULA页面、取消向导、运行“静音安装”以及在所有子目录中搜索之类的内容。
当我从命令行手动调用它(参见下面的示例)时,它似乎工作得很好。由于命令行开关,我使用它在控制台中打印了一堆信息级别的日志消息。
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的副本并测试自己,我已经使用了在这个链接上提供了一个,绑定了正在使用的dpinst.xml文件。请记住,您需要使用/C命令行开关调用它,以便生成任何命令行输出。或者,如果您疑神疑鬼,并且不想从某个随机堆栈溢出问题下载可执行文件,您可以从微软获得dpinst.exe实用程序作为视窗驱动套件的一部分。这是免费下载,但您必须从完整的WDK ISO (约700 MB)中提取实用程序(只有500 KB)。你说了算。:)
发布于 2015-09-09 16:20:44
例如,您的代码在标准工具(如"ping")中运行得非常好。那么,也许因为某种原因,dpinst会写到标准错误中吗?您可以设置RedirectStandardError = true,并读取StandardError以检查是否是这种情况。
更新,以防其他人遇到此问题:
似乎dpinst不写入标准输出,而是以其他方式将消息记录到控制台。实现你的目标的唯一方法是:记住"%SystemRoot%\DPINST.LOG“文件的大小,运行命令,等待退出,然后读取记忆中的位置和文件结束之间的所有内容。这样你就能拿到你的日志了。
发布于 2018-08-29 20:41:35
我的回答会帮助其他人。当您运行"C:\Windows\DPINST.LOG“并添加swicth /C以将日志转储到控制台时,它还会在此目录/C中创建一个日志文件。
你可以在那里找到日志文件。
https://stackoverflow.com/questions/32484379
复制相似问题