Я выполняю командный файл со следующим кодом:
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);
Проверьте вкладку Статистика Task Manager
- я уверен, что там много блокнотов.
Вы создаете Process
с StartInfo.CreateNoWindow = true;
, Это предотвращает открытие окна notepad
, так как нет окна - нет блокнота. UseShellExecute = false;
же самое поведение для UseShellExecute = false;
,
Удалите эти строки и попробуйте другое время (и убедитесь, что существует файл notepadPath
, и пакет, если вы запустите его вручную, открывает блокнот).
// 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.
Таким образом, вы просто создаете свой процесс и партии, ожидая его закрытия, чего никогда не произойдет.
Task Manager
много блокнотов (и cmd тоже)! Но удаление этих строк все равно не отобразит блокнот ...
notepad
с process.BeginOutputReadLine();
? Я думаю, что вы никогда не получите что-то из блокнота
"\"
как escape-символ ... вы проходили через код с помощью отладчика, чтобы увидеть, происходят ли определенные вещи ... или не произойдет, как вы ожидали