
C#からDOSコマンドなどの別プロセスを実行する方法が分からず、方法を調べたので忘備録として記録します。
C#でコマンドを実行する
結論からになりますが以下のコードでDOSコマンドを実行することができます。
using System;
using System.Diagnostics;
class ExecuteCom
{
public static void Main()
{
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe", "/k dir");
Process.Start(processStartInfo);
}
}
コードの簡単な説明になりますが、ProcessStartInfoの第一引数にコマンド、第二引数にコマンドの引数を与えてあげて、Process.Start()をコールすることでコマンドを実行することができます。
今回はdirコマンドを実行してみた例になります。
コマンドが終了するまで待つ方法
先ほどのコードではコマンドを終了することを待たずにプログラムが進んでしまいます。
そこで、同期的にコマンドを実行させたい場合は、process.WaitForExit()を使いましょう。
先ほどのコードを改造して同期的にコマンドを実行しているサンプルコードは以下の通りです。(クラス名などは変わっていないため省略しています。)
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe", "/k dir");
Process process = Process.Start(processStartInfo);
// プロセスが終了するまで待機
process.WaitForExit();
// プロセスを終了させる
process.Close();
process.WaitForExit()の後に書いているprocessStartInfo.Close()はプロセスを終了させるためのコマンドです。
これをコールしないとゾンビプロセスが残ってしまうのでコールし忘れには気を付ける必要があります。
コマンドプロンプトを非表示にする
コマンドを呼びだすたびにコマンドプロンプトの窓が起動するのが嫌な場合、ProcessStartInfoクラスのプロパティを変更することで非表示にすることができます。
変更するプロパティは以下の二つです。
- CreateNoWindow
- UseShellExecute
先ほどのコードを改造してコマンドプロンプトが表示されないようにしていきます。
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe", "/k dir");
processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;
Process process = Process.Start(processStartInfo);
これでコマンドプロンプトのウィンドウが開かなくなりました。
まとめ
出力結果などをC#側で取得する方法などもあり色々できそうなので気になる方は調べてください。