在C#中执行批处理文件

我试图在C#中执行批处理文件,但我没有得到任何好运。

我在互联网上发现了多个例子,但它不适合我。

public void ExecuteCommand(string command) { int ExitCode; ProcessStartInfo ProcessInfo; Process Process; ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command); ProcessInfo.CreateNoWindow = true; ProcessInfo.UseShellExecute = false; Process = Process.Start(ProcessInfo); Process.WaitForExit(); ExitCode = Process.ExitCode; Process.Close(); MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand"); } 

命令字符串包含批处理文件的名称(存储在system32中)以及它应该处理的一些文件。 (例如:txtmanipulator file1.txt file2.txt file3.txt)当我手动执行批处理文件,它能正常工作。

当执行代码时,它给了我一个ExitCode:1 (捕获所有的一般错误)

我究竟做错了什么?

这应该工作。 您可以尝试转储输出和错误流的内容,以了解发生了什么事情:

 static void ExecuteCommand(string command) { int exitCode; ProcessStartInfo processInfo; Process process; processInfo = new ProcessStartInfo("cmd.exe", "/c " + command); processInfo.CreateNoWindow = true; processInfo.UseShellExecute = false; // *** Redirect the output *** processInfo.RedirectStandardError = true; processInfo.RedirectStandardOutput = true; process = Process.Start(processInfo); process.WaitForExit(); // *** Read the streams *** // Warning: This approach can lead to deadlocks, see Edit #2 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); exitCode = process.ExitCode; Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output)); Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error)); Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand"); process.Close(); } static void Main() { ExecuteCommand("echo testing"); } 

*编辑*

鉴于下面评论中的额外信息,我能够重新创建问题。 似乎有一些安全设置,导致这种行为(没有详细调查)。

如果bat文件不在c:\ windows \ system32中,这可以工作。 尝试将其移动到其他位置,例如可执行文件的位置。 请注意,保持自定义bat文件或可执行文件在Windows目录是不好的做法。

*编辑2 * 事实证明 ,如果流被同步读取,可能会发生死锁,无论是通过在WaitForExit之前同步读取,或通过同时读取stderr和stdout一个接一个。

如果使用异步读取方法,则不会发生这种情况,如下例所示:

 static void ExecuteCommand(string command) { var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command); processInfo.CreateNoWindow = true; processInfo.UseShellExecute = false; processInfo.RedirectStandardError = true; processInfo.RedirectStandardOutput = true; var process = Process.Start(processInfo); process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine("output>>" + e.Data); process.BeginOutputReadLine(); process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine("error>>" + e.Data); process.BeginErrorReadLine(); process.WaitForExit(); Console.WriteLine("ExitCode: {0}", process.ExitCode); process.Close(); } 
 System.Diagnostics.Process.Start("c:\\batchfilename.bat"); 

这个简单的行将执行批处理文件。

在steinar的一些很好的帮助之后,这对我是有效的:

 public void ExecuteCommand(string command) { int ExitCode; ProcessStartInfo ProcessInfo; Process process; ProcessInfo = new ProcessStartInfo(Application.StartupPath + "\\txtmanipulator\\txtmanipulator.bat", command); ProcessInfo.CreateNoWindow = true; ProcessInfo.UseShellExecute = false; ProcessInfo.WorkingDirectory = Application.StartupPath + "\\txtmanipulator"; // *** Redirect the output *** ProcessInfo.RedirectStandardError = true; ProcessInfo.RedirectStandardOutput = true; process = Process.Start(ProcessInfo); process.WaitForExit(); // *** Read the streams *** string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); ExitCode = process.ExitCode; MessageBox.Show("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output)); MessageBox.Show("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error)); MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand"); process.Close(); } 

它工作正常。 我测试它是这样的:

 String command = @"C:\Doit.bat"; ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command); // ProcessInfo.CreateNoWindow = true; 

我评论了关闭窗口,所以我可以看到它运行。

下面的代码为我工作得很好

 using System.Diagnostics; public void ExecuteBatFile() { Process proc = null; string _batDir = string.Format(@"C:\"); proc = new Process(); proc.StartInfo.WorkingDirectory = _batDir; proc.StartInfo.FileName = "myfile.bat"; proc.StartInfo.CreateNoWindow = false; proc.Start(); proc.WaitForExit(); ExitCode = proc.ExitCode; proc.Close(); MessageBox.Show("Bat file executed..."); } 

你有没有尝试以管理员身份启动它? 如果您使用Visual Studio作为管理员启动Visual Studio,因为使用.bat文件需要这些权限。

 using System.Diagnostics; private void ExecuteBatFile() { Process proc = null; try { string targetDir = string.Format(@"D:\mydir"); //this is where mybatch.bat lies proc = new Process(); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.FileName = "lorenzo.bat"; proc.StartInfo.Arguments = string.Format("10"); //this is argument proc.StartInfo.CreateNoWindow = false; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; //this is for hiding the cmd window...so execution will happen in back ground. proc.Start(); proc.WaitForExit(); } catch (Exception ex) { Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString()); } } 

只是:

 System.Diagnostics.Process.Start("**c:\\YOUR-BATCH-FILENAME.bat**");