749 votes

Exécuter les commandes de l'invite de commande

Existe-t-il un moyen d'exécuter des commandes d'invite de commande à partir d'une application C# ? Si oui, comment dois-je procéder ?

copy /b Image1.jpg + Archive.rar Image2.jpg

Il s'agit essentiellement d'incorporer un fichier RAR dans une image JPG. Je me demandais simplement s'il y avait un moyen de faire cela automatiquement en C#. Merci.

7 votes

Duplicata de stackoverflow.com/questions/181719/ (il y a une réponse qui fait ce que vous voulez).

1 votes

stackoverflow.com/a/5367686/492 a une meilleure réponse

1128voto

RameshVel Points 24472

c'est tout ce que vous avez à faire pour exécuter des commandes shell à partir de C#

string strCmdText;
strCmdText= "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);

EDIT :

C'est pour cacher la fenêtre cmd.

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.StartInfo = startInfo;
process.Start();

189 votes

/C Exécute la commande spécifiée par la chaîne de caractères, puis se termine.

18 votes

C'est juste pour dire au cmd de s'exécuter et de se terminer (sans attendre une entrée de l'utilisateur pour fermer la fenêtre).

3 votes

Merci, une dernière question. Y a-t-il un moyen de masquer l'invite de commande pendant cette opération ?

181voto

Ogglas Points 1

J'ai essayé la solution de @RameshVel mais je n'ai pas pu passer d'arguments dans mon application console. Si quelqu'un rencontre le même problème, voici une solution :

using System.Diagnostics;

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

cmd.StandardInput.WriteLine("echo Oscar");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());

2 votes

Je ne lui ai laissé aucune chance en pensant que sur ma machine il y a des restrictions d'administration ou d'anti-virus mais le code ci-dessus fonctionne ! merci Ogglas

9 votes

Cette ligne : cmd.StartInfo.CreateNoWindow = true ; a sauvé ma journée.

4 votes

Existe-t-il un moyen d'exécuter plusieurs commandes en une seule fois ? cmd.StandardInput.WriteLine(@"cd C:\Test; pwd")

49voto

HackerMan Points 285
   var proc1 = new ProcessStartInfo();
       string anyCommand; 
        proc1.UseShellExecute = true;

        proc1.WorkingDirectory = @"C:\Windows\System32";

        proc1.FileName = @"C:\Windows\System32\cmd.exe";
        proc1.Verb = "runas";
        proc1.Arguments = "/c "+anyCommand;
        proc1.WindowStyle = ProcessWindowStyle.Hidden;
        Process.Start(proc1);

4 votes

Quel est le @ en C# ?

12 votes

@Pacerier Il indique au compilateur d'échapper tous les caractères qui devraient normalement être échappés dans la chaîne, dans ce cas-ci \. Donc, sans le \, votre code serait comme suit proc1.FileName = "C:\\Windows\\System32\\cmd.exe";

0 votes

@JamesKo, Ah, je l'ai trouvé : stackoverflow.com/q/556133/632951 . Google est toujours aussi mauvais en matière de symboles.

19voto

Matt Points 550

Aucune des réponses ci-dessus n'a aidé pour une raison quelconque, il semble qu'elles balaient les erreurs sous le tapis et rendent le dépannage de la commande difficile. J'ai donc fini par trouver quelque chose comme ceci, peut-être que cela aidera quelqu'un d'autre :

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\tf.exe",
        Arguments = "checkout AndroidManifest.xml",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WorkingDirectory = @"C:\MyAndroidApp\"
    }
};

proc.Start();

0 votes

Si je voulais compiler ceci dans une application console autonome, quel autre code devrait être ajouté pour que cela fonctionne ? (Je suis un novice en matière de programmation, je n'ai fait que du scripting). J'utilise csc.exe en fait.

1 votes

@copyitright Un espace de nom et une classe. Si vous créez simplement un nouveau projet, ils seront générés pour vous.

0 votes

Ah, c'est pas grave. Si vous utilisez la fonction cmd.exe vous pouvez passer des commandes comme arguments.

12voto

Tyrrrz Points 438

Vous pouvez le faire en utilisant CliWrap en une seule ligne :

var result = await Cli.Wrap("cmd")
    .WithArguments("copy /b Image1.jpg + Archive.rar Image2.jpg")
    .ExecuteBufferedAsync();

var stdOut = result.StandardOutput;

0 votes

J'ai upvoted ce ... mais le repo semble être manquant maintenant : Unable to find package 'CliWrap' at source

1 votes

@ZachSmith pas sûr de ce que vous voulez dire, nuget.org/packages/CliWrap semble fonctionner correctement. Le lien original aussi.

0 votes

Ah, désolé pour une raison quelconque, lorsque je n'ai pas pu me connecter à mon dépôt nuget via le vpn, je n'ai pas pu installer ce paquet. nuget est toujours un mystère pour moi. J'ai dû mal le configurer.

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