我有一个Powershell脚本,它每5秒输出到控制台一次,就像这样:
While($true)
{
Write-Output "test"
Start-Sleep -seconds 5
}
我希望有一个Windows窗体应用程序,该应用程序将允许用户输入脚本的文件路径,单击按钮,然后在如下所示的窗口中显示此脚本的任何其他输出:
但是,实际上在启动此脚本时遇到了麻烦。根据阅读不同的线程,这是我目前所拥有的:
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右侧的白色文本框,并在脚本提供输出时不断地追加到该文本框。
答案 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;
}
}