web-dev-qa-db-fra.com

Exécuter les commandes d'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 ferais-je:

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

Cela incorpore fondamentalement un fichier RAR dans une image JPG. Je me demandais s'il y avait un moyen de faire cela automatiquement en C #.

500
user

c’est tout ce que vous avez à faire pour exécuter les 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:

Ceci 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

L'important est que l'argument commence par /C sinon cela ne fonctionnera pas. How Scott Ferguson dit: il "Exécute la commande spécifiée par la chaîne puis se termine."

780
RameshVel

J'ai essayé la solution @RameshVel mais je ne pouvais pas 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());
88
Ogglas
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);
30
HackerMan

Bien que techniquement, cela ne réponde pas directement à la question posée, mais bien à la question de savoir comment faire ce que l’affiche originale voulait faire: combiner des fichiers. En réalité, il s’agit d’un article qui aide les débutants à comprendre de quoi parlent Instance Hunter et Konstantin.

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 se remplit avec le contenu du fichier Zip (en petits morceaux plutôt qu'en une seule opération de lecture), puis le tampon est écrit à l'arrière du fichier .jpg 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
CarllDev

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 .NET IO. Vous pouvez utiliser File.ReadAllBytes pour lire les fichiers, puis File.WriteAllBytes pour écrire la version "incorporée".

8
Instance Hunter

Aucune des réponses ci-dessus n’a aidé pour une raison quelconque, il semble qu’elles balayent les erreurs et rendent le dépannage difficile. Alors 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();
8
Matt Bonness

Vous pouvez le faire en utilisant CliWrap sur une ligne:

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

Voici une version peu simple et moins codée. 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
kamalpreet

avec une référence à Microsoft.VisualBasic

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

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

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

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

J'ai découvert que les 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
Peter verleg

si vous voulez garder la fenêtre cmd ouverte ou si vous voulez l'utiliser dans winform/wpf, utilisez-la comme ceci

    string strCmdText;
//For Testing
    strCmdText= "/K ipconfig";

 System.Diagnostics.Process.Start("CMD.exe",strCmdText);

/ K

Gardera la fenêtre cmd ouverte

0
Uniquedesign