it-swarm.com.de

Führen Sie die Eingabeaufforderungsbefehle aus

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.

500
user

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."

780
RameshVel

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

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);
            }
        }
    }
}
10
CarllDev

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.

8
Instance Hunter

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();
8
Matt Bonness

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;
6
Tyrrrz

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

mit einem Verweis auf Microsoft.VisualBasic

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

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);
1
Peter verleg

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

0
Uniquedesign

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

0
XMMR12