【C#】外部プロセスやコマンドを起動する

目次

概要

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 を設定します。
  • 管理者権限での実行
    • ProcessStartInfoVerb プロパティに "runas" を設定することで、UACプロンプトを出して管理者として実行させることができます。

注意点

  1. パスのスペース
    • 引数内のファイルパスにスペースが含まれる場合(例: C:\Program Files\...)、パス全体をダブルクォートで囲む必要があります("\"C:\\Program Files\\...\"")。
  2. WaitForExitの重要性
    • Process.Start はプロセスを起動するとすぐに制御を戻します。起動した処理の結果(ファイル生成など)を後続のコードで使う場合は、必ず WaitForExit() で完了を待ってください。
  3. プラットフォーム依存
    • 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 を利用する形に移行してください。また、外部コマンド実行時はセキュリティ(コマンドインジェクション)にも配慮し、引数のエスケープ処理を適切に行う必要があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次