目次
概要
C#プログラムから外部のアプリケーション(メモ帳、ブラウザ、コマンドプロンプトなど)を起動したり、シェルコマンドを実行したりする方法です。 System.Diagnostics.Process.Start メソッドを使用することで、他のexeファイルの実行や、引数を渡したコマンド処理が可能になります。
仕様(入出力)
- 入力
fileName: 実行するアプリケーションのパス、またはコマンド名(例: “notepad.exe”, “cmd.exe”)。arguments: アプリケーションに渡すコマンドライン引数(オプション)。
- 出力
Process: 起動したプロセスを操作するためのオブジェクト(起動に失敗した場合は例外)。
- 動作
- 指定されたプログラムを新しいプロセスとして立ち上げます。
基本の使い方
実行ファイル名と引数を指定して呼び出します。
using System.Diagnostics;
// メモ帳で特定のファイルを開く
Process.Start("notepad.exe", @"C:\logs\error.log");
// ブラウザでURLを開く (.NET Core以降は ProcessStartInfo が必要な場合あり)
Process.Start("explorer.exe", "https://google.com");
コード全文
Windowsのコマンドプロンプト(cmd.exe)経由でファイルコピーコマンドを実行し、その終了を待機するコンソールアプリケーションです。
using System;
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
// テスト用のダミーファイル作成
File.WriteAllText("example.txt", "This is a test file.");
Console.WriteLine("--- コマンド実行開始 ---");
// 1. プロセスの起動
// fileName: "cmd.exe" (コマンドプロンプト)
// arguments: "/c copy example.txt example_backup.txt"
// /c : コマンド実行後に終了するオプション
// copy ... : 実際のコピーコマンド
try
{
using (Process proc = Process.Start("cmd.exe", "/c copy example.txt example_backup.txt"))
{
if (proc != null)
{
// 2. プロセスの終了を待機
// これを行わないと、コピーが終わる前に次の処理に進んでしまう
proc.WaitForExit();
// 終了コードの確認 (0なら正常終了)
Console.WriteLine($"Exit Code: {proc.ExitCode}");
}
}
Console.WriteLine("--- コマンド実行完了 ---");
// 結果確認
if (File.Exists("example_backup.txt"))
{
Console.WriteLine("成功: バックアップファイルが作成されました。");
}
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生しました: {ex.Message}");
}
}
}
実行結果例
--- コマンド実行開始 ---
1 個のファイルをコピーしました。
Exit Code: 0
--- コマンド実行完了 ---
成功: バックアップファイルが作成されました。
カスタムポイント
- ウィンドウの非表示
- 黒い画面(コンソールウィンドウ)を出したくない場合は、
ProcessStartInfoクラスを使用し、CreateNoWindow = trueおよびUseShellExecute = falseを設定します。
- 黒い画面(コンソールウィンドウ)を出したくない場合は、
- 管理者権限での実行
ProcessStartInfoのVerbプロパティに"runas"を設定することで、UACプロンプトを出して管理者として実行させることができます。
注意点
- パスのスペース
- 引数内のファイルパスにスペースが含まれる場合(例:
C:\Program Files\...)、パス全体をダブルクォートで囲む必要があります("\"C:\\Program Files\\...\"")。
- 引数内のファイルパスにスペースが含まれる場合(例:
- WaitForExitの重要性
Process.Startはプロセスを起動するとすぐに制御を戻します。起動した処理の結果(ファイル生成など)を後続のコードで使う場合は、必ずWaitForExit()で完了を待ってください。
- プラットフォーム依存
cmd.exeはWindows専用です。LinuxやmacOSで動作させる場合は、/bin/bashなどOSに合わせたシェルを指定する必要があります。
応用
ProcessStartInfoを使った詳細設定(標準出力の取得)
コマンドの実行結果(コンソールに表示されるテキスト)をC#プログラム内で文字列として受け取る実装例です。
using System;
using System.Diagnostics;
class ProcessUtil
{
public static void RunPing()
{
var psi = new ProcessStartInfo
{
FileName = "ping",
Arguments = "8.8.8.8 -n 3", // Google DNSに3回ping
RedirectStandardOutput = true, // 出力を読み取る設定
UseShellExecute = false, // リダイレクトには必須
CreateNoWindow = true // 黒画面を出さない
};
using (var proc = Process.Start(psi))
{
// 出力を最後まで読み取る
string result = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
Console.WriteLine("=== Ping結果 ===");
Console.WriteLine(result);
}
}
}
まとめ
Process.Start は外部ツールとの連携に不可欠なメソッドです。単純な起動であれば引数2つのメソッド呼び出しで十分ですが、黒画面の抑制や結果の取得、環境変数の設定などを行う場合は ProcessStartInfo を利用する形に移行してください。また、外部コマンド実行時はセキュリティ(コマンドインジェクション)にも配慮し、引数のエスケープ処理を適切に行う必要があります。
