Получить значения из процесса StandardOutput

c# wpf .net-4.0

8483 просмотра

1 ответ

Я пытаюсь получить выходные данные, чтобы показать открытые в данный момент документы на моем компьютере, но он возвращает NULL, несмотря ни на что.

StringCollection values = new StringCollection();
var proc = new Process
{
     StartInfo = new ProcessStartInfo
     {
          FileName = "openfiles.exe",
          Arguments = "/query /FO CSV /v",
          UseShellExecute = false,
          RedirectStandardOutput = true,
          CreateNoWindow = true
     }
};
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
     string line = proc.StandardOutput.ReadLine();
     values.Add(line);
}
foreach (string sline in values)
MessageBox.Show(sline);

Редактировать:

В ходе дальнейшего рассмотрения я вижу, что у меня возникает проблема с исключением. Во время моего запуска Diag я получаю следующее: Proc.BasePriority за исключением типа System.InvalidOperationException

Редактировать:

Попытка получить код как:

string val = proc.StandardOutput.ReadToEnd();
MessageBox.Show(val);

Также значение NULL при возврате, и у Proc все еще были ошибки даже после proc.start () ;.

Автор: Saren Источник Размещён: 12.11.2019 09:45

Ответы (1)


10 плюса

Решение

Вы должны прочитать как стандартный вывод, так и стандартные потоки ошибок. Это потому, что вы не можете прочитать их обоих из одной темы.

Чтобы достичь этого, вы должны использовать обработчики событий, которые будут вызываться в отдельном потоке.

Скомпилируйте код, anycpuа openfilesприходит в варианте 32-битной и 64-битной. Он может не найти исполняемый файл, если существует несоответствие архитектуры.

Строки, которые считываются из потока ошибок, начинаются с! > Так они выделяются на выходе.

    StringCollection values = new StringCollection();
    var proc = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "openfiles.exe",
            Arguments = "/query /FO CSV /v",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = false
        }
    };
    proc.Start();

    proc.OutputDataReceived += (s,e) => {
        lock (values)
        {
            values.Add(e.Data);
        }
    };
    proc.ErrorDataReceived += (s,e) => {
        lock (values)
        {
            values.Add("! > " + e.Data);
        }
    };

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
    foreach (string sline in values)
        MessageBox.Show(sline);
Автор: rene Размещён: 22.02.2013 08:51
Вопросы из категории :
32x32