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#.
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."
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());
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, 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);
}
}
}
}
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".
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();
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();
, 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 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);