Выполнение команды пакетного файла в C#

#c# #batch-file

#c# #пакетный файл

Вопрос:

У меня есть следующий код в моем приложении на C #, который автоматически загружал пакетный файл с помощью командной строки и выполнял и возвращал результат в виде строки:

 System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = @"C:filessend.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);
  

Когда код выполняется, я на короткое время вижу окно командной строки, прежде чем оно закроется, и выполнение работает некорректно. Как я могу устранить проблему?

Комментарии:

1. Я забыл, что такое пакетная команда «ждать ввода пользователя», но я бы подождал ввода пользователя и посмотрел, что говорит окно командной строки, прежде чем оно закроется, это может дать вам ключ к пониманию того, почему он терпит неудачу.

2. У вас startInfo.Arguments есть несколько команд ( echo и java это две отдельные команды).

3. Мне не разрешено иметь несколько команд? Как бы я ее разбил?

Ответ №1:

Вместо того, чтобы использовать 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. @SearchForKnowledge Рад, что смог помочь.

Ответ №2:

Обратите внимание, что, вызывая cmd напрямую, вы фактически создаете пакетный скрипт с тем, что вы используете в свойстве Arguments . Как и в случае с файлом .bat, окно командной строки закрывается, как только это будет сделано. Чтобы исправить это, добавьте команду pause в конец.

 startInfo.Arguments = "@ECHO ON java com.this.test567 sendnpause";
  

Ответ №3:

 amp; seperates commands on a line.

amp;amp; 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 ONamp;java com.this.test567amp;send"
  

/k сохраняет окно открытым.

таким образом, вы получите в cmd

 cmd /k @ECHO ONamp;java com.this.test567amp;send