我目前有一部分代码可以创建一个新进程并从shell执行它。
Process p = new Process();
...
p.Start();
p.WaitForExit();
这会在进程运行时保持窗口打开,这很棒。但是,我还想在完成之后保持窗口打开以查看潜在的消息。有没有办法做到这一点?
答案 0 :(得分:34)
capture the output和StandardOutput中的StandardError更容易,将每个输出存储在StringBuilder中,并在流程结束时使用该结果。
var sb = new StringBuilder();
Process p = new Process();
// redirect the output
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
// hookup the eventhandlers to capture the data that is received
p.OutputDataReceived += (sender, args) => sb.AppendLine(args.Data);
p.ErrorDataReceived += (sender, args) => sb.AppendLine(args.Data);
// direct start
p.StartInfo.UseShellExecute=false;
p.Start();
// start our event pumps
p.BeginOutputReadLine();
p.BeginErrorReadLine();
// until we are done
p.WaitForExit();
// do whatever you need with the content of sb.ToString();
您可以在sb.AppendLine
语句中添加额外的格式,以区分标准输出和错误输出,如下所示:sb.AppendLine("ERR: {0}", args.Data);
答案 1 :(得分:25)
这将打开shell,启动可执行文件并在进程结束时保持shell窗口打开
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "CMD.EXE";
psi.Arguments = "/K yourmainprocess.exe";
p.StartInfo = psi;
p.Start();
p.WaitForExit();
或只是
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "CMD.EXE";
psi.Arguments = "/K yourmainprocess.exe";
Process p = Process.Start(psi);
if(p != null && !p.HasExited)
p.WaitForExit();
答案 2 :(得分:1)
关于:“无法使用实例引用访问成员Process.Start(ProcessStartInfo);而应使用类型名称来限定它”
这为我解决了问题。...
this.login().then(
user => console.log(user);
)
答案 3 :(得分:0)
请特别注意开关/ k,因为在许多示例中,通常都使用/ c。
CMD / K运行命令,然后返回到CMD提示符。
CMD / C运行命令,然后终止
var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/k yourmainprocess.exe";
p.Start();
p.WaitForExit();