Cela devrait fonctionner. Vous pouvez essayer de vider le contenu des flux de sortie et d'erreur afin de savoir ce qui se passe:
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");
}
* ÉDITER *
Compte tenu des informations supplémentaires contenues dans votre commentaire ci-dessous, j'ai pu recréer le problème. Il semble y avoir un paramètre de sécurité qui entraîne ce comportement (je n'ai pas étudié cela en détail).
Cela ne fonctionne si le fichier batch ne se trouve pas dans C:\Windows\System32
. Essayez de le déplacer vers un autre emplacement, par exemple l'emplacement de votre exécutable. Notez que conserver des fichiers batch ou exécutables personnalisés dans le répertoire Windows est de toute façon une mauvaise pratique.
* EDIT 2 *
Il s'avère que si les flux sont lus de manière synchrone, un blocage peut se produire, soit en lisant de manière synchrone avant WaitForExit
ou en lisant les deux stderr
et de manière stdout
synchrone l'un après l'autre.
Cela ne devrait pas se produire si vous utilisez les méthodes de lecture asynchrones à la place, comme dans l'exemple suivant:
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
c'est. S'il contient des chemins avec des espaces, vous devrez les mettre entre guillemets.