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 WaitForExit
lub czytając jednocześnie stderr
i stdout
synchronicznie 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();
}
command
jest. Jeśli zawiera ścieżki ze spacjami, musisz umieścić je w cudzysłowie.