调用Powershell脚本并在Windows Form应用程序中显示其输出

时间:2019-03-09 03:37:22

标签: c# powershell windows-forms-designer

我有一个Powershell脚本,它每5秒输出到控制台一次,就像这样:

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

我希望有一个Windows窗体应用程序,该应用程序将允许用户输入脚本的文件路径,单击按钮,然后在如下所示的窗口中显示此脚本的任何其他输出:

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 Application右侧的白色文本框,并在脚本提供输出时不断地追加到该文本框。

1 个答案:

答案 0 :(得分:0)

尝试此代码,使用“字符串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;
  }
}