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

问题描述 投票:0回答:1

我有一个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桌面应用程序右侧的白色文本框,并在脚本提供输出时不断附加到该文本框。

c# powershell windows-forms-designer
1个回答
0
投票

试试这段代码,取“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;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.