Un guide complet sur l'exécution de fichiers batch en C# et la gestion des erreurs potentielles
Lors du traitement de fichiers batch en C#, les développeurs rencontrent souvent le problème de l'échec d'exécution. Cet article vise à résoudre les problèmes courants et à fournir des conseils sur l’exécution efficace des fichiers batch.
Le problème
Comme l'utilisateur l'a mentionné, l'exécution du fichier batch à l'aide de l'extrait de code fourni entraîne un ExitCode de 1, indiquant qu'une erreur générique s'est produite. Le problème réside dans la manière dont la chaîne de commande est transmise au fichier batch.
Solution
Pour résoudre ce problème, notez que la chaîne de commande doit contenir le chemin complet du fichier batch, pas seulement son nom. De plus, il est recommandé de rediriger les flux de sortie standard et d’erreurs du processus pour récupérer les messages ou erreurs générés lors de l’exécution.
Méthode de synchronisation :
<code class="language-csharp">static void ExecuteCommand(string command) { int exitCode; ProcessStartInfo processInfo; Process process; // 指定批处理文件的完整路径 processInfo = new ProcessStartInfo(@"C:\Windows\System32\txtmanipulator.bat", command); // 使用@符号避免转义 processInfo.CreateNoWindow = true; processInfo.UseShellExecute = false; // *** 重定向输出 *** processInfo.RedirectStandardError = true; processInfo.RedirectStandardOutput = true; process = Process.Start(processInfo); process.WaitForExit(); // *** 读取流 *** string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); exitCode = process.ExitCode; Console.WriteLine("输出>>" + (String.IsNullOrEmpty(output) ? "(无)" : output)); Console.WriteLine("错误>>" + (String.IsNullOrEmpty(error) ? "(无)" : error)); Console.WriteLine("ExitCode: " + exitCode.ToString()); process.Close(); }</code>
Méthode asynchrone (pour éviter les blocages) :
<code class="language-csharp">static void ExecuteCommand(string command) { var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command); // 使用cmd.exe执行,更稳妥 processInfo.CreateNoWindow = true; processInfo.UseShellExecute = false; processInfo.RedirectStandardError = true; processInfo.RedirectStandardOutput = true; var process = Process.Start(processInfo); process.OutputDataReceived += (sender, e) => Console.WriteLine("输出>>" + e.Data); process.BeginOutputReadLine(); process.ErrorDataReceived += (sender, e) => Console.WriteLine("错误>>" + e.Data); process.BeginErrorReadLine(); process.WaitForExit(); Console.WriteLine("ExitCode: {0}", process.ExitCode); process.Close(); }</code>
Autres notes
Si le fichier batch se trouve dans un répertoire différent de celui de l'exécutable, vous devez fournir son chemin complet dans la chaîne de commande. Pour des raisons de sécurité, il n'est pas recommandé d'enregistrer des fichiers batch personnalisés ou des fichiers exécutables dans les répertoires Windows. Il est recommandé d'utiliser @"C:pathtoyourfile.bat"
pour spécifier le chemin afin d'éviter les problèmes d'échappement de barre oblique inverse. La méthode asynchrone de lecture du flux est plus recommandée car elle évite les problèmes potentiels de blocage. Utiliser cmd.exe /c
pour exécuter un fichier batch est plus fiable que de démarrer directement le fichier batch et peut mieux gérer diverses situations.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!