今天我在编写一个监控bat运行状态的程序,这程序本来跟我以前编写的一个监控exe运行状态的程序大同小异,不过却得出不同的结果(bat的运行不会停下来):
exe:
p.StandardInput.WriteLine(@"cd\"); p.StandardInput.WriteLine(@"C:"); p.StandardInput.WriteLine(@"cd C:\Program Files (x86)"); p.StandardInput.WriteLine(@"dosomethings.exe --arguments"); p.StandardInput.WriteLine("exit");
这下我不得不修改这段代码强制让bat结束:
bat:
p.StandardInput.WriteLine(@"cd\"); p.StandardInput.WriteLine(@"C:"); p.StandardInput.WriteLine(@"cd C:\Program Files (x86)"); p.StandardInput.WriteLine(@"dosomethins.bat --arguments & exit");
这段代码也是可以用bat里面获取到exit code的:
strOutput = p.StandardOutput.ReadToEnd(); p.WaitForExit(); iExitCode = p.ExitCode; p.Close();
我还在网上发现了一段可以改进我的程序的方法(程序可以异步地跑bat脚本和获取command line输出结果):
http://www.cnblogs.com/ymind/archive/2012/03/23/2415038.html
以下是他的代码--同步:
using (Process process = new System.Diagnostics.Process()) { process.StartInfo.FileName = "ping"; process.StartInfo.Arguments = "www.ymind.net"; // 必须禁用操作系统外壳程序 process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); string output = process.StandardOutput.ReadToEnd(); if (String.IsNullOrEmpty(output) == false) this.textBox1.AppendText(output + "\r\n"); process.WaitForExit(); process.Close(); }
异步:
private void button3_Click(object sender, EventArgs e) { using (Process process = new System.Diagnostics.Process()) { process.StartInfo.FileName = "ping"; process.StartInfo.Arguments = "www.ymind.net -t"; // 必须禁用操作系统外壳程序 process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); // 异步获取命令行内容 process.BeginOutputReadLine(); // 为异步获取订阅事件 process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); } } private void process_OutputDataReceived(object sender, DataReceivedEventArgs e) { // 这里仅做输出的示例,实际上您可以根据情况取消获取命令行的内容 // 参考:process.CancelOutputRead() if (String.IsNullOrEmpty(e.Data) == false) this.AppendText(e.Data + "\r\n"); } #region 解决多线程下控件访问的问题 public delegate void AppendTextCallback(string text); public void AppendText(string text) { if (this.textBox1.InvokeRequired) { AppendTextCallback d = new AppendTextCallback(AppendText); this.textBox1.Invoke(d, text); } else { this.textBox1.AppendText(text); } } #endregion
时间: 2024-12-27 20:35:40