Question Exécuter des commandes d'invite de commandes


Est-il possible d'exécuter des commandes d'invite de commande à 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 #.


470
2017-09-24 04:24


origine


Réponses:


c'est tout ce que vous devez 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);

MODIFIER:

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();

EDIT: 2

Important est que l'argument commence par /C sinon ça ne marchera pas. Comment Scott Ferguson a dit: it "Exécute la commande spécifiée par la chaîne et se termine ensuite."


726
2017-09-24 04:34



J'ai essayé la solution @RameshVel mais je ne pouvais pas transmettre d'arguments dans mon application console. Si quelqu'un éprouve 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());

74
2017-09-30 17:22



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);

26
2018-04-04 17:52



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 quelque chose, c'est un message pour aider les débutants à comprendre ce dont parlent Instance Hunter et Konstantin.

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

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
2018-03-04 09:37



Oui, il y a (voir le lien dans le commentaire de Matt Hamilton), mais il serait plus facile et meilleur d'utiliser les classes d'E / S .NET. Vous pouvez utiliser File.ReadAllBytes pour lire les fichiers, puis File.WriteAllBytes pour écrire la version "incorporée".


8
2017-09-24 04:30



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 difficile. Donc, j'ai fini par aller avec quelque chose comme ça, peut-être que ça va aider 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
2018-01-24 04:01



Voici une petite version simple et moins de code. Il va cacher la fenêtre de la console aussi

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
2017-12-02 06:03



avec une référence à Microsoft.VisualBasic

Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);

4
2017-08-25 01:26



Vous pouvez le faire en utilisant CliWrap en une ligne:

var stdout = new Cli("cmd")
         .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
         .StandardOutput;

4
2017-10-29 17:33