Как я могу захватить вывод консоли 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"

Вы можете найти файл журнала там..

Другие вопросы по тегам