Вызов сценария Powershell и отображение его вывода в приложении Windows Form - PullRequest
0 голосов
/ 09 марта 2019

У меня есть скрипт powershell, который выводится на консоль каждые 5 секунд, например:

While($true)
{
    Write-Output "test"
    Start-Sleep -seconds 5
}

Я хочу иметь приложение Windows Form, которое позволит пользователю ввести путь к файлу сценария, нажать кнопку, а затем отобразить любые дальнейшие выходные данные этого сценария в окне, например:

enter image description here

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

private void button1_Click(object sender, EventArgs e)
        {
            string filepath = textBox1.Text;
            if (File.Exists(filepath))
            {
                string s = "";
                var info = new ProcessStartInfo();
                Process process = new Process();

                info.UseShellExecute = false;
                info.RedirectStandardOutput = true;
                info.FileName = "powershell.exe";
                info.Arguments = filepath;

                process.StartInfo = info;

                process.Start();

                s += process.StandardOutput.ReadToEnd();
                process.WaitForExit();
                textBox1.AppendText(s);

            }
            else
            {
                textBox1.Text = "Error: Invalid file path.";
            }
        }

Теперь, это действительно открывает окно powershell, поэтому я знаю, что оно, по крайней мере, запускает процесс, но я не вижу, чтобы оно фактически запускало мой скрипт, и я знаю, что файл существует по пути, который я ввожу. Когда я запускаю powershell.exe {filepath} в терминале командной строки, скрипт работает нормально.

Конечная цель состоит в том, чтобы все выходные данные были записаны в белое текстовое поле с правой стороны приложения Form Desktop выше и постоянно добавлялись в это текстовое поле по мере того, как скрипт выводит.

1 Ответ

0 голосов
/ 09 марта 2019

Попробуйте этот код, возьмите "string s = process.StandardOutput.ReadToEnd ();" и запустить поток прямо перед процессом. WaitForExit (); затем вы можете выйти из потока после завершения процесса. Все еще возможно, что вам может понадобиться создать функцию делегата для печати текста в текстовом поле, если это так, посмотрите на функции делегата, которые легко реализовать.

    Thread t = new Thread(ReadStart);
    t.Start(process);
    process.WaitForExit();


public void ReadStart(object data)
{
  System.Diagnostics.Process p = (System.Diagnostics.Process)data;
  while(true)
  {
    string s  = p.StandardOutput.ReadToEnd();
    textBox1.AppendText(s);
    Thread.Sleep(1000);
    if (p.HasExited) break;
  }
}
...