Gibt es eine Möglichkeit, Eingabeaufforderungsbefehle in einer C # -Anwendung auszuführen? Wenn ja, wie würde ich Folgendes tun:
copy /b Image1.jpg + Archive.rar Image2.jpg
Im Wesentlichen wird eine RAR-Datei in das JPG-Bild eingebettet. Ich habe mich nur gefragt, ob es einen Weg gibt, dies automatisch in C # zu tun.
dies ist alles, was Sie tun müssen, um Shell-Befehle von C # auszuführen.
string strCmdText;
strCmdText= "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);
EDIT:
Hiermit wird das Cmd-Fenster ausgeblendet.
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
Wichtig ist, dass das Argument mit /C
beginnt, sonst funktioniert es nicht. Wie Scott Ferguson sagte: "Führt den durch die Zeichenfolge angegebenen Befehl aus und beendet dann."
Versuchte @RameshVel-Lösung, aber ich konnte keine Argumente in meiner Konsolenanwendung übergeben. Wenn jemand das gleiche Problem hat, ist hier eine Lösung:
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);
Obwohl dies technisch keine direkte Antwort auf die gestellte Frage ist, beantwortet es doch die Frage, wie das zu tun ist, was das ursprüngliche Poster wollte: Dateien kombinieren. Wenn überhaupt, ist dies ein Beitrag, der Neulingen dabei hilft zu verstehen, worüber Instance Hunter und Konstantin sprechen.
Dies ist die Methode, die ich zum Kombinieren von Dateien verwende (in diesem Fall ein jpg und ein zip). Beachten Sie, dass ich einen Puffer erstelle, der mit dem Inhalt der Zip-Datei gefüllt wird (in kleinen Abschnitten und nicht in einem großen Lesevorgang). Dann wird der Puffer auf die Rückseite der JPG-Datei geschrieben, bis das Ende der Zip-Datei erreicht ist erreicht:
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);
}
}
}
}
Ja, das gibt es (siehe Link in Matt Hamiltons Kommentar), aber es wäre einfacher und besser, die IO - Klassen von .NET zu verwenden. Sie können File.ReadAllBytes zum Lesen der Dateien und dann File.WriteAllBytes zum Schreiben der "eingebetteten" Version verwenden.
Keine der oben genannten Antworten hat aus irgendeinem Grund geholfen, es scheint, als würden sie Fehler unter den Teppich kehren und die Fehlersuche schwierig machen. Also habe ich am Ende so etwas gemacht, vielleicht hilft es jemand anderem:
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();
Sie können dies mit CliWrap in einer Zeile tun:
var stdout = new Cli("cmd")
.Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
.StandardOutput;
Hier ist wenig einfache und weniger Code-Version. Es wird das Konsolenfenster auch ausblenden-
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();
mit einem Verweis auf Microsoft.VisualBasic
Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);
Sie können dies mithilfe der folgenden Methode erreichen (wie in anderen Antworten erwähnt):
strCmdText = "'/C some command";
Process.Start("CMD.exe", strCmdText);
Als ich die oben aufgeführten Methoden ausprobierte, stellte ich fest, dass mein benutzerdefinierter Befehl nicht mit der Syntax einiger der obigen Antworten funktionierte.
Ich fand heraus, dass komplexere Befehle in Anführungszeichen gekapselt werden müssen, um zu funktionieren:
string strCmdText;
strCmdText = "'/C cd " + path + " && composer update && composer install -o'";
Process.Start("CMD.exe", strCmdText);
wenn Sie das cmd-Fenster geöffnet lassen möchten oder es in winform/wpf verwenden möchten, verwenden Sie es so
string strCmdText;
//For Testing
strCmdText= "/K ipconfig";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);
/ K
Das Cmd-Fenster bleibt geöffnet
sie können einfach den Code in einer .bat
- Formaterweiterung schreiben, den Code der Batchdatei:
c:/ copy /b Image1.jpg + Archive.rar Image2.jpg
benutze diesen c # code:
Process.Start("file_name.bat")