web-dev-qa-db-ja.com

コマンドプロンプトコマンドの実行

C#アプリケーション内からコマンドプロンプトコマンドを実行する方法はありますか?もしそうなら、私はどのように私は次のことをするでしょう:

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

これは基本的にJPG画像内にRARファイルを埋め込みます。 C#でこれを自動的に行う方法があるかどうか、私は思っていませんでした。

521
user

c#からシェルコマンドを実行するために必要な作業はこれだけです。

string strCmdText;
strCmdText= "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);

編集:

これは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();

編集:2

重要なのは、引数が/Cで始まっていることです。そうでなければうまくいきません。どのように Scott Ferguson が言ったのですか: "文字列で指定されたコマンドを実行して終了します。"

805
RameshVel

@RameshVelソリューションを試しましたが、コンソールアプリケーションに引数を渡すことができませんでした。誰かが同じ問題を経験しているのであれば、これが解決策です。

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());
93
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);
31
HackerMan

技術的には、これは提起された質問に直接答えるものではありませんが、元のポスターがやりたかったことをどのように行うかという質問には答えます。どちらかといえば、これは初心者がInstance HunterとKonstantinが何について話しているのか理解するのを助けるための記事です。

これは私がファイルを結合するために使用する方法です(この場合jpgとZip)。 Zipファイルの内容でいっぱいになるバッファを作成し(1回の大きな読み込み操作ではなく小さなチャンクで)、その後Zipファイルの末尾が終わるまでバッファをjpgファイルの後ろに書き込みます。に達しました:

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

はい、あります(Matt Hamiltonのコメントのリンクを参照)が、.NETのIOクラスを使用する方が簡単で優れているでしょう。 File.ReadAllBytesを使用してファイルを読み取り、次にFile.WriteAllBytesを使用して「埋め込み」バージョンを書き込むことができます。

8
Instance Hunter

上記の答えのどれも何らかの理由で助けにはならなかった、それはそれらが敷物の下で誤りを一掃し、そしてトラブルシューティングを自分の命令を困難にするように思える。だから私は結局このようなものを使って行きました、多分それは他の誰かを助けるでしょう:

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

これを CliWrap を使って1行で実行できます。

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

これはちょっと単純で少ないコードバージョンです。コンソールウィンドウも隠します -

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

Microsoft.VisualBasic を参照して

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

cmdウィンドウを開いたままにしたい場合、またはwinform/wpfで使用したい場合は、このように使用します。

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

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

/ K

Cmdウィンドウを開いたままにします

3
Uniquedesign

これを実現するには、次の方法を使用します(他の回答で説明しています)。

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

上記の方法を試したところ、上記のいくつかの回答の構文を使用してもカスタムコマンドが機能しないことがわかりました。

動作させるには、もっと複雑なコマンドを引用符で囲む必要があることがわかりました。

string strCmdText;
strCmdText = "'/C cd " + path + " && composer update && composer install -o'";
Process.Start("CMD.exe", strCmdText);
2
Peter verleg

あなたは単に.batフォーマット拡張、バッチファイルのコードでコードを書くことを使うことができます:

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

このC#のコードを使用してください:

Process.Start("file_name.bat")

0
XMMR12