在C#中执行批处理文件命令

时间:2014-06-18 13:36:36

标签: c# batch-file

我的C#应用​​程序中有以下代码,它使用命令提示符静默加载批处理文件并执行并将结果返回给字符串:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = @"C:\files\send.bat";
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
string strGetInfo = proc.StandardOutput.ReadToEnd();
strCMDOut = strGetInfo.Substring(strGetInfo.Length - 5, 3);
proc.WaitForExit();

我试图避免我的应用程序转到另一个文件来执行批处理文件,而是我想将它嵌入我的应用程序中。所以我将上面的代码更改为:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "@ECHO ON java com.this.test567 send";
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
proc.StartInfo = startInfo;
proc.Start();
string strGetInfo = proc.StandardOutput.ReadToEnd();
strCMDOut = strGetInfo.Substring(strGetInfo.Length - 5, 3);

当代码执行时,我可以看到命令提示符窗口在关闭之前的短暂时间并且执行无法正常工作。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

除了使用cmd.exe之外,只需直接使用java,您还应该重定向标准错误并在流程结束后检查它。

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = @"java.exe";
proc.StartInfo.Arguments = "com.this.test567";

proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
string strGetInfo = proc.StandardOutput.ReadToEnd();
if(string.IsNullOrEmpty(strGetInfo))
    strGetInfo = proc.StandardError.ReadToEnd();
proc.WaitForExit();

答案 1 :(得分:1)

请注意,通过直接调用cmd,您可以使用Arguments属性中的任何内容有效地创建批处理脚本。像.bat文件一样,命令窗口一完成就会关闭。要解决此问题,请在末尾添加暂停命令。

startInfo.Arguments = "@ECHO ON java com.this.test567 send\npause";

答案 2 :(得分:1)

& seperates commands on a line.

&& executes this command only if previous command's errorlevel is 0.

|| (not used above) executes this command only if previous command's errorlevel is NOT 0

> output to a file

>> append output to a file

< input from a file

| output of one command into the input of another command

^ escapes any of the above, including itself, if needed to be passed to a program

使用&amp;

分隔命令
"/k @ECHO ON&java com.this.test567&send"

/ k打开一个窗口。

所以你将进入cmd

cmd /k @ECHO ON&java com.this.test567&send