Как я могу захватить вывод консоли 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 запускалась локально и тестировалась самостоятельно, я предоставил ее по этой ссылке в комплекте с файлом dpinst.xml, который я использую. Помните, что вам нужно вызвать его с /C
переключатель командной строки для генерации любого вывода командной строки. Кроме того, если вы параноик и не хотите загружать исполняемый файл из какого-либо случайного вопроса переполнения стека, вы можете получить утилиту dpinst.exe в составе набора драйверов Windows от Microsoft. Это бесплатная загрузка, но вы должны извлечь утилиту (которая составляет всего 500 КБ) из полного ISO WDK (который составляет ~700 МБ). Вам решать.:)
2 ответа
Ваш код прекрасно работает, например, со стандартными инструментами (такими как "ping"). Так, может, по какой-то причине dpinst пишет вместо стандартной ошибки? Вы можете установить RedirectStandardError = true и прочитать StandardError, чтобы проверить, так ли это.
ОБНОВЛЕНО, если кто-то еще столкнется с этой проблемой:
Кажется, что dpinst не записывает в стандартный вывод, а записывает сообщения на консоль другим способом. Единственный способ достичь вашей цели, который мне приходит в голову, это: запомнить размер файла "%SystemRoot%\DPINST.LOG", выполнить команду, дождаться выхода, а затем прочитать все между запомненной позицией и концом файла. Таким образом, вы получите свои логи.
Я мой ответ поможет другим. Когда вы запускаете Dpinst.exe и добавляете swicth /C для вывода журнала в консоль, он также создает файл журнала в этом каталоге "C: \ Windows \ DPINST.LOG"
Вы можете найти файл журнала там..