Как записать «корневой путь» в переменную - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь запустить logman.exe для повышенного CMD, для этого приведенного ниже кода, который я пытался,

 var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = @"C:\Windows\System32\cmd.exe",
                Arguments = "cmd /k logman.exe PerfCounterCustom  | findstr \"Root\"",
                Verb = "runas",
                UseShellExecute = true,
            }
        };

        try
        {
            proc.Start();
            while (!proc.StandardOutput.EndOfStream)
            {
                string line = proc.StandardOutput.ReadLine();
            }
            Console.WriteLine("Successfully elevated!");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

И он выдает ошибку, например,

enter image description here

System.InvalidOperationException: StandardOut has not been redirected or the process hasn't started yet. at System.Diagnostics.Process.get_StandardOutput()

2 Вопросы,

  1. , когда я запускаю приложение exe, оно показывает окно 2 CMD,1-й показывает ошибку, а 2-й показывает результат для аргумента "cmd /k logman.exe PerfCounterCustom | findstr \"Root\"" [Root Path]

как отключить отображение обоих окон?

Почему я получаю эту ошибку?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

На ваш 1-й вопрос: В ProcessStartInfo установите WindowStyle на ProcessWindowStyle.Hidden

0 голосов
/ 24 мая 2018

Альтернативное решение для чтения выходных данных команды - записать выходные данные в текстовый файл.Поэтому вы должны добавить >> "[Name or Path of file].txt" в конец вашей команды.Затем просто прочитайте файл из C #, например, с помощью File.ReadAllLines.Здесь нужно учесть две вещи: если вы часто делаете это во время выполнения, и команда выдает огромное количество текста, не записывайте его на SSD.Пожалуйста, убедитесь, что файл пуст / не существует раньше, потому что Windows просто добавляет вывод в конец файла.Если вы запускаете это в нескольких потоках, используйте идентификатор потока в имени файла.

0 голосов
/ 23 мая 2018

Вам нужно установить RedirectStandardOutput из ProcessStartInfo в true, и вы должны запустить proc.WaitForExit() перед чтением вывода.Обратите внимание, что это решение вызывает несовместимость при запуске процесса от имени администратора через runas.

...