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 #.
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."
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());
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);
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);
}
}
}
}
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".
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();
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;
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();
avec une référence à Microsoft.VisualBasic
Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);
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);
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