157 votes

Exécuter un fichier batch en C #

Je suis en train d'exécuter un fichier de commandes en C# mais je ne reçois pas tous la chance de le faire.

J'ai trouvé plusieurs exemples sur internet, mais il ne fonctionne pas pour moi.

        public void ExecuteCommand(string command)
    {

        int ExitCode;
        ProcessStartInfo ProcessInfo;
        Process Process;

        ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
        ProcessInfo.CreateNoWindow = true;
        ProcessInfo.UseShellExecute = false;

        Process = Process.Start(ProcessInfo);
        Process.WaitForExit();

        ExitCode = Process.ExitCode;
        Process.Close();

        MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand");
    }

La chaîne de commande contient le nom du fichier de commandes (stockées dans system32) et de certains fichiers, il doit manipuler. (Exemple: txtmanipulator file1.txt file2.txt file3.txt Lorsque j'execute le fichier de commandes manuellement, il fonctionne correctement.

Lors de l'exécution du code, cela me donne un ExitCode: 1 (fourre-tout pour genral des erreurs)

Ce que je fais mal?

210voto

steinar Points 4762

Cela devrait fonctionner. Vous pourriez essayer de vider le contenu de l'erreur et de sortie des flux 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 ***
    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");
}   

* EDIT *

Compte tenu de l'information supplémentaire dans votre commentaire ci-dessous, j'ai pu reproduire le problème. Il semble y avoir un paramètre de sécurité que les résultats de ce comportement (n'ai pas étudié en détail).

Cela ne fonctionne que si le fichier bat n'est pas situé dans c:\windows\system32. Essayez de le déplacer vers un autre emplacement, par exemple l'emplacement de votre fichier exécutable. Notez que le maintien personnalisé les fichiers bat ou les exécutables dans le répertoire Windows est une mauvaise pratique de toute façon.

139voto

T.S.Sathish Points 331
 System.Diagnostics.Process.Start("c:\\batchfilename.bat");
 

cette simple ligne exécutera le fichier de commandes.

20voto

Wesz-T Points 274

Après une aide précieuse de steinar, voici ce qui a fonctionné pour moi:

     public void ExecuteCommand(string command)
    {
        int ExitCode;
        ProcessStartInfo ProcessInfo;
        Process process;

        ProcessInfo = new ProcessStartInfo(Application.StartupPath + "\\txtmanipulator\\txtmanipulator.bat", command);
        ProcessInfo.CreateNoWindow = true;
        ProcessInfo.UseShellExecute = false;
        ProcessInfo.WorkingDirectory = Application.StartupPath + "\\txtmanipulator";
        // *** Redirect the output ***
        ProcessInfo.RedirectStandardError = true;
        ProcessInfo.RedirectStandardOutput = true;

        process = Process.Start(ProcessInfo);
        process.WaitForExit();

        // *** Read the streams ***
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();

        ExitCode = process.ExitCode;

        MessageBox.Show("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
        MessageBox.Show("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
        MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand");
        process.Close();
    }
 

15voto

Steve Wellens Points 14348

Ça fonctionne bien. Je l'ai testé comme ça:

         String command = @"C:\Doit.bat";

        ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
        // ProcessInfo.CreateNoWindow = true;
 

J'ai commenté en éteignant la fenêtre pour pouvoir la voir courir.

1voto

Kristifor Points 1

Avez-vous essayé de le démarrer en tant qu'administrateur? Démarrez Visual Studio en tant qu'administrateur si vous l'utilisez car il nécessite ces privilèges pour pouvoir utiliser des fichiers .bat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X