Тайм-аут выполнения командного файла для определенных команд

1

Я выполняю командный файл со следующим кодом:

using (var process = new Process())
{
   process.StartInfo.CreateNoWindow = true;
   process.StartInfo.FileName = "cmd.exe";
   process.StartInfo.Arguments = "/c \"\"" + batchFile + "\"\"";
   process.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
   process.StartInfo.UseShellExecute = false;
   process.StartInfo.RedirectStandardOutput = true;
   process.StartInfo.RedirectStandardError = true;

   var output = new StringBuilder();
   var error = new StringBuilder();

   using (var outputWaitHandle = new AutoResetEvent(false))
   using (var errorWaitHandle = new AutoResetEvent(false))
   {
      process.OutputDataReceived += (sender, e) =>
      {
         if (e.Data == null)
         {
            outputWaitHandle.Set();
         }
         else
         {
            output.AppendLine(e.Data);
         }
       };

       process.ErrorDataReceived += (sender, e) =>
       {
          if (e.Data == null)
          {
             errorWaitHandle.Set();
          }
          else
          {
             error.AppendLine(e.Data);
          }
       };

       process.Start();

       process.BeginOutputReadLine();
       process.BeginErrorReadLine();

       if (process.WaitForExit(30000) &&
           outputWaitHandle.WaitOne(30000) &&
           errorWaitHandle.WaitOne(30000))
           {
              Log("Batch file exit code: " + process.ExitCode + ".\nOutput: " + output + ".\nError ouput: " + error);
           }
           else
           {
              Log("The batch file timed out.");
           }
     }
   }

Этот код выполняет пакетный файл и ждет его завершения. И он отлично работает, когда мой пакетный файл выводится только в текстовый файл. Но если мой пакетный файл содержит строку start "C:\Windows\System32" notepad.exe, время истекает. Зачем?

РЕДАКТИРОВАТЬ

Я просто понял, что он зависает, даже если все, что у меня есть в моем пакетном файле, это notepad.exe, но он отлично работает, если я пишу в текстовый файл. Код выхода - InvalidOperation

РЕДАКТИРОВАТЬ

Даже с помощью этого простого кода он не откроет блокнот. Он не бросает никаких исключений и ничего...

string notepadPath = Path.Combine(Environment.SystemDirectory, "notepad.exe");
    if (System.IO.File.Exists(notepadPath))
       Process.Start(notepadPath);
  • 0
    что вы имеете в виду тайм-аут .. запускает ли notepad.exe ..? или когда он зависает ... пытались ли вы использовать буквальный символ в пути к файлу, возможно, он смотрит на "\" как escape-символ ... вы проходили через код с помощью отладчика, чтобы увидеть, происходят ли определенные вещи ... или не произойдет, как вы ожидали
  • 0
    Он не запускает notepad.exe, он просто зависает.
Показать ещё 2 комментария
Теги:
batch-file
process

1 ответ

1

Проверьте вкладку Статистика Task Manager - я уверен, что там много блокнотов.
Вы создаете Process с StartInfo.CreateNoWindow = true; , Это предотвращает открытие окна notepad, так как нет окна - нет блокнота. UseShellExecute = false; же самое поведение для UseShellExecute = false; ,

Удалите эти строки и попробуйте другое время (и убедитесь, что существует файл notepadPath, и пакет, если вы запустите его вручную, открывает блокнот).

Согласно MSDN:

// This code assumes the process you are starting will terminate itself.  
// Given that is is started without a window so you cannot terminate it  
// on the desktop, it must terminate itself or you can do it programmatically 
// from this application using the Kill method.

Таким образом, вы просто создаете свой процесс и партии, ожидая его закрытия, чего никогда не произойдет.

  • 0
    В моем Task Manager много блокнотов (и cmd тоже)! Но удаление этих строк все равно не отобразит блокнот ...
  • 0
    И что вы ожидаете от notepad с process.BeginOutputReadLine(); ? Я думаю, что вы никогда не получите что-то из блокнота
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню