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