Das sollte funktionieren. Sie könnten versuchen, den Inhalt der Ausgabe- und Fehlerströme zu löschen, um herauszufinden, was passiert:
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");
}
* BEARBEITEN *
Aufgrund der zusätzlichen Informationen in Ihrem Kommentar unten konnte ich das Problem neu erstellen. Es scheint eine Sicherheitseinstellung zu geben, die zu diesem Verhalten führt (habe dies nicht im Detail untersucht).
Dies funktioniert , wenn sich die Batchdatei nicht in befindet C:\Windows\System32
. Versuchen Sie, es an einen anderen Speicherort zu verschieben, z. B. an den Speicherort Ihrer ausführbaren Datei. Beachten Sie, dass das Speichern benutzerdefinierter Batchdateien oder ausführbarer Dateien im Windows-Verzeichnis ohnehin eine schlechte Praxis ist.
* EDIT 2 *
Es stellt sich heraus, dass beim synchronen Lesen der Streams ein Deadlock auftreten kann, entweder durch synchrones Lesen vor WaitForExit
oder durch Lesen von beiden stderr
undstdout
synchron nacheinander.
Dies sollte nicht passieren, wenn stattdessen die asynchronen Lesemethoden verwendet werden, wie im folgenden Beispiel:
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
ist. Wenn es Pfade mit Leerzeichen enthält, müssen Sie sie in Anführungszeichen setzen.