To powinno działać. Możesz spróbować zrzucić zawartość strumieni wyjściowych i strumieni błędów, aby dowiedzieć się, co się dzieje:
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");
}
* EDYTOWAĆ *
Biorąc pod uwagę dodatkowe informacje zawarte w poniższym komentarzu, udało mi się odtworzyć problem. Wydaje się, że istnieje pewne ustawienie zabezpieczeń, które powoduje takie zachowanie (nie zbadano tego szczegółowo).
Działa to, jeśli plik wsadowy nie znajduje się w C:\Windows\System32. Spróbuj przenieść go w inne miejsce, np. Lokalizację pliku wykonywalnego. Zauważ, że przechowywanie niestandardowych plików wsadowych lub plików wykonywalnych w katalogu Windows jest i tak złą praktyką.
EDIT * 2 *
To Okazuje się , że jeśli strumienie są odczytywane synchronicznie, może nastąpić zakleszczenie, albo przed przeczytaniem synchronicznie WaitForExitlub czytając jednocześnie stderri stdoutsynchronicznie jeden po drugim.
Nie powinno to mieć miejsca, jeśli zamiast tego używasz asynchronicznych metod odczytu, jak w poniższym przykładzie:
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();
}
commandjest. Jeśli zawiera ścieżki ze spacjami, musisz umieścić je w cudzysłowie.