C#Process执行批处理后如何获取返回值?
2016-04-22 15:09
246 查看
代码如下
p.StartInfo = new System.Diagnostics.ProcessStartInfo(path, pwd);
p.Start();
其中path是个BAT的路径!
我想要得到执行后的返回值来判断批处理运行期间是否错误?
请问如何做呢?
批处理程序内容如下:
@echo off
for /f "delims=" %%a in (PCList.config) do net use \\%%a\ipc$ /delete
for /f "delims=" %%a in (PCList.config) do net use \\%%a\ipc$ %1 /user:administrator
pause
在C#中运行一个dos命令,并截取输出、输出流的问题,这个问题我以前在Java中实现过,由于在C#中没有遇到过类似的 情况,为了避免每次别人问都要一遍一遍演示的情况,特地做了一个简单的例子,实现在WinForm中ping一个网站,并且将ping的结果显示在一个文本框中。
p.StartInfo = new System.Diagnostics.ProcessStartInfo(path, pwd);
p.Start();
其中path是个BAT的路径!
我想要得到执行后的返回值来判断批处理运行期间是否错误?
请问如何做呢?
批处理程序内容如下:
@echo off
for /f "delims=" %%a in (PCList.config) do net use \\%%a\ipc$ /delete
for /f "delims=" %%a in (PCList.config) do net use \\%%a\ipc$ %1 /user:administrator
pause
// Define the namespaces used by this sample. using System; using System.Text; using System.Globalization; using System.IO; using System.Diagnostics; using System.Threading; using System.ComponentModel; namespace ProcessAsyncStreamSamples { class ProcessNetStreamRedirection { // Define static variables shared by class methods. private static StreamWriter streamError =null; private static String netErrorFile = ""; private static StringBuilder netOutput = null; private static bool errorRedirect = false; private static bool errorsWritten = false; public static void RedirectNetCommandStreams() { String netArguments; Process netProcess; // Get the input computer name. Console.WriteLine("Enter the computer name for the net view command:"); netArguments = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture); if (String.IsNullOrEmpty(netArguments)) { // Default to the help command if there is not an input argument. netArguments = "/?"; } // Check if errors should be redirected to a file. errorsWritten = false; Console.WriteLine("Enter a fully qualified path to an error log file"); Console.WriteLine(" or just press Enter to write errors to console:"); netErrorFile = Console.ReadLine().ToUpper(CultureInfo.InvariantCulture); if (!String.IsNullOrEmpty(netErrorFile)) { errorRedirect = true; } // Note that at this point, netArguments and netErrorFile // are set with user input. If the user did not specify // an error file, then errorRedirect is set to false. // Initialize the process and its StartInfo properties. netProcess = new Process(); netProcess.StartInfo.FileName = "Net.exe"; // Build the net command argument list. netProcess.StartInfo.Arguments = String.Format("view {0}", netArguments); // Set UseShellExecute to false for redirection. netProcess.StartInfo.UseShellExecute = false; // Redirect the standard output of the net command. // This stream is read asynchronously using an event handler. netProcess.StartInfo.RedirectStandardOutput = true; netProcess.OutputDataReceived += new DataReceivedEventHandler(NetOutputDataHandler); netOutput = new StringBuilder(); if (errorRedirect) { // Redirect the error output of the net command. netProcess.StartInfo.RedirectStandardError = true; netProcess.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler); } else { // Do not redirect the error output. netProcess.StartInfo.RedirectStandardError = false; } Console.WriteLine("\nStarting process: net {0}", netProcess.StartInfo.Arguments); if (errorRedirect) { Console.WriteLine("Errors will be written to the file {0}", netErrorFile); } // Start the process. netProcess.Start(); // Start the asynchronous read of the standard output stream. netProcess.BeginOutputReadLine(); if (errorRedirect) { // Start the asynchronous read of the standard // error stream. netProcess.BeginErrorReadLine(); } // Let the net command run, collecting the output. netProcess.WaitForExit(); if (streamError != null) { // Close the error file. streamError.Close(); } else { // Set errorsWritten to false if the stream is not // open. Either there are no errors, or the error // file could not be opened. errorsWritten = false; } if (netOutput.Length > 0) { // If the process wrote more than just // white space, write the output to the console. Console.WriteLine("\nPublic network shares from net view:\n{0}\n", netOutput); } if (errorsWritten) { // Signal that the error file had something // written to it. String [] errorOutput = File.ReadAllLines(netErrorFile); if (errorOutput.Length > 0) { Console.WriteLine("\nThe following error output was appended to {0}.", netErrorFile); foreach (String errLine in errorOutput) { Console.WriteLine(" {0}", errLine); } } Console.WriteLine(); } netProcess.Close(); } private static void NetOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine) { // Collect the net view command output. if (!String.IsNullOrEmpty(outLine.Data)) { // Add the text to the collected output. netOutput.Append(Environment.NewLine + " " + outLine.Data); } } private static void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine) { // Write the error text to the file if there is something // to write and an error file has been specified. if (!String.IsNullOrEmpty(errLine.Data)) { if (!errorsWritten) { if (streamError == null) { // Open the file. try { streamError = new StreamWriter(netErrorFile, true); } catch (Exception e) { Console.WriteLine("Could not open error file!"); Console.WriteLine(e.Message.ToString()); } } if (streamError != null) { // Write a header to the file if this is the first // call to the error output handler. streamError.WriteLine(); streamError.WriteLine(DateTime.Now.ToString()); streamError.WriteLine("Net View error output:"); } errorsWritten = true; } if (streamError != null) { // Write redirected errors to the file. streamError.WriteLine(errLine.Data); streamError.Flush(); } } } } }
string arg = string.Format(backupFmt, server, user, pwd, database, file); Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.WorkingDirectory = location + @"bin"; p.StartInfo.Arguments = arg; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.Start(); StreamWriter sw = p.StandardInput; sw.WriteLine(arg); sw.WriteLine(Environment.NewLine); sw.Close(); #if DEBUG StreamReader sr = p.StandardOutput; string str = sr.ReadToEnd(); if(!string.IsNullOrEmpty(str)) { Console.WriteLine("restore file:" + file); Console.WriteLine("message:" + str); } sr.Close();#endif p.WaitForExit(); p.Close();
在C#中运行一个dos命令,并截取输出、输出流的问题,这个问题我以前在Java中实现过,由于在C#中没有遇到过类似的 情况,为了避免每次别人问都要一遍一遍演示的情况,特地做了一个简单的例子,实现在WinForm中ping一个网站,并且将ping的结果显示在一个文本框中。
private void btnExecute_Click(object sender, EventArgs e) { tbResult.Text = ""; ProcessStartInfo start = new ProcessStartInfo("Ping.exe");//设置运行的命令行文件问ping.exe文件,这个文件系统会自己找到 //如果是其它exe文件,则有可能需要指定详细路径,如运行winRar.exe start.Arguments = txtCommand.Text;//设置命令参数 start.CreateNoWindow = true;//不显示dos命令行窗口 start.RedirectStandardOutput = true;// start.RedirectStandardInput = true;// start.UseShellExecute = false;//是否指定操作系统外壳进程启动程序 Process p=Process.Start(start); StreamReader reader = p.StandardOutput;//截取输出流 string line = reader.ReadLine();//每次读取一行 while (!reader.EndOfStream) { tbResult.AppendText(line+" "); line = reader.ReadLine(); } p.WaitForExit();//等待程序执行完退出进程 p.Close();//关闭进程 reader.Close();//关闭流 }
相关文章推荐
- DataGridView分页
- 《C# in Depth:深入理解C#》读书笔记 - 方法组转换和匿名方法
- 《C# in Depth:深入理解C#》读书笔记 - 可空类型
- C# 获取当前日期在指定日期范围内是第几周
- C# ASE加密解密
- C#中定义调用方法
- c#简答(1)
- 《C# in Depth:深入理解C#》读书笔记 - 泛型
- C# Socket 您的主机中的软件中止了一个已建立的连接 An established connection was aborted by the software in your host machine
- 【C#关于编码那点事】
- C# 获取硬件信息
- C# Ini配置文件
- 使用C#格式化字符串 ~
- C#带百分比的进度条
- C#实现通过程序自动抓取远程Web网页信息的代码
- C# 参考之方法参数关键字:params、ref及out
- .NET(C#) File类的常用方法
- c#基础(一)
- C#中ToString()格式详解
- C#日志写入