Це має спрацювати. Ви можете спробувати скинути вміст потоків виводу та помилок, щоб дізнатися, що відбувається:
static void ExecuteCommand(string command)
{
int exitCode;
ProcessStartInfo processInfo;
Process process;
processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
// *** Redirect the output ***
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
process = Process.Start(processInfo);
process.WaitForExit();
// *** Read the streams ***
// Warning: This approach can lead to deadlocks, see Edit #2
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
exitCode = process.ExitCode;
Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
process.Close();
}
static void Main()
{
ExecuteCommand("echo testing");
}
* Редагувати *
З огляду на додаткову інформацію у вашому коментарі нижче, я зміг відновити проблему. Здається, є деякі параметри безпеки, які призводять до такої поведінки (не детально досліджували це).
Це робить роботу , якщо пакетний файл не знаходиться в C:\Windows\System32. Спробуйте перемістити його в інше місце, наприклад, місце розташування вашого виконуваного файлу. Зауважте, що зберігати власні пакетні файли чи виконувані файли у каталозі Windows все одно є поганою практикою.
* EDIT 2 *
Це виходить, що якщо потоки зчитуються синхронно, тупиковий може відбуватися або шляхом зчитування синхронно перед тим WaitForExitабо шляхом зчитування як stderrі stdoutсинхронно один за одним.
Це не повинно статися, якщо натомість використовувати асинхронні методи зчитування, як у наступному прикладі:
static void ExecuteCommand(string command)
{
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
var process = Process.Start(processInfo);
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
Console.WriteLine("output>>" + e.Data);
process.BeginOutputReadLine();
process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
Console.WriteLine("error>>" + e.Data);
process.BeginErrorReadLine();
process.WaitForExit();
Console.WriteLine("ExitCode: {0}", process.ExitCode);
process.Close();
}
commandє. Якщо він містить шляхи з пробілами, вам потрібно буде поставити цитати навколо них.