#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