Exécuter Les Commandes D'Invite De Commande

Existe-t-il un moyen d'exécuter des commandes d'invite de commandes à partir d'une application C#? Si oui, comment ferais-je ce qui suit:

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

Cela intègre essentiellement un fichier RAR dans L'image JPG. Je me demandais juste s'il y avait un moyen de le faire automatiquement en C#.

483
demandé sur Dominik 2009-09-24 08:24:45

10 réponses

C'est tout ce que vous avez à faire 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);

Modifier:

C'est pour masquer 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();

MODIFIER: 2

Important est que l'argument commence par /C sinon cela ne fonctionnera pas. CommentScott Ferguson a dit: il " exécute la commande spécifiée par la chaîne et se termine ensuite."

744
répondu RameshVel 2018-04-24 13:07:39

Essayé la solution @ 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());
77
répondu Ogglas 2015-09-30 17:22:43
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);
28
répondu HackerMan 2015-12-18 19:22:26

Bien que techniquement cela ne réponde pas directement à la question posée, il répond à la question de savoir comment faire ce que l'affiche originale voulait faire: combiner des fichiers. Si quoi que ce soit, ceci est un poste pour aider les débutants à comprendre ce que Hunter Instance et Konstantin parlent.

C'est la méthode que j'utilise pour combiner des fichiers (dans ce cas, un jpg et un zip). Notez que je crée un tampon qui est rempli avec le contenu du fichier zip (en petits morceaux plutôt que dans une grande opération de lecture), et puis le tampon est écrit à l'arrière du fichier jpg jusqu'à ce que la fin du fichier zip soit atteinte:

private void CombineFiles(string jpgFileName, string zipFileName)
{
    using (Stream original = new FileStream(jpgFileName, FileMode.Append))
    {
        using (Stream extra = new FileStream(zipFileName, FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[32 * 1024];

            int blockSize;
            while ((blockSize = extra.Read(buffer, 0, buffer.Length)) > 0)
            {
                original.Write(buffer, 0, blockSize);
            }
        }
    }
}
10
répondu CarllDev 2014-03-04 09:37:41

Oui, il y en a (voir le lien dans le commentaire de Matt Hamilton), mais il serait plus facile et préférable d'utiliser les classes D'E / S.net. Vous pouvez utiliser Fichier.ReadAllBytes pour lire les fichiers, puis fichier.WriteAllBytes pour écrire la version "embedded".

8
répondu Instance Hunter 2009-09-24 04:30:48

Aucune des réponses ci-dessus n'a aidé pour une raison quelconque, il semble qu'ils balayent les erreurs sous le tapis et rendent le dépannage de sa commande difficile. J'ai donc fini par aller avec quelque chose comme ça, 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();
6
répondu Matt Bonness 2017-01-24 04:01:38

Voici peu de version simple et moins de code. Cela masquera également la fenêtre de la console -

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.Start();
5
répondu kamalpreet 2015-12-02 06:03:13

, Avec une référence à Microsoft.VisualBasic

Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);
4
répondu Slai 2016-08-25 01:26:32

Vous pouvez le faire en utilisant CliWrap dans une ligne:

var stdout = new Cli("cmd")
         .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
         .StandardOutput;
4
répondu Tyrrrz 2017-10-29 17:33:23

Vous pouvez y parvenir en utilisant la méthode suivante (comme mentionné dans d'autres réponses):

strCmdText = "'/C some command";
Process.Start("CMD.exe", strCmdText);

Lorsque j'ai essayé les méthodes énumérées ci-dessus, j'ai constaté que ma commande personnalisée ne fonctionnait pas en utilisant la syntaxe de certaines des réponses ci-dessus.

J'ai découvert que des commandes plus complexes doivent être encapsulées entre guillemets pour fonctionner:

string strCmdText;
strCmdText = "'/C cd " + path + " && composer update && composer install -o'";
Process.Start("CMD.exe", strCmdText);
1
répondu Peter verleg 2018-02-18 19:59:43