【C#.NET解説】Process、ProcessStartInfoクラスを徹底解説 月の女神が語る基本機能と使い方

2024年11月29日金曜日

プロセス

t f B! P L

名前空間 System.Diagnostics

自己紹介

こんにちは、人間たち。私は狩猟・貞潔の女神。月の女神でもあるわ。でも今日はあなたたちのプログラミングスキルを向上させるために、ProcessProcessStartInfoについてお話しするわ。 プロセスの操作や外部プログラムの起動、制御がC#.NETでいかに簡単にできるか、見ていきましょう。

基本機能

まずはProcessクラスの基本機能について説明するわ。外部プログラムを起動するのに使えるこのクラスは、非常に便利よ。以下は簡単な例で、電卓を起動するコードよ。

C#

// Processクラスを使って電卓を起動する例
using System.Diagnostics;

class Program
{
    static void Main()
    {
        Process.Start("calc"); // 電卓を起動
    }
}

とてもシンプルでしょ?ただし、この例では詳細な設定はできないから、複雑な操作が必要な場合は後で説明するProcessStartInfoを使うのをおすすめするわ。

注意点

プロセス操作では、リソースの管理や意図しない動作を防ぐために注意が必要よ。例えば、システム上のすべてのプロセスを取得して、特定のプロセスを終了するコードを見てみましょう。

C#

// プロセス一覧を取得し、特定のプロセスを終了する例
using System.Diagnostics;

class Program
{
    static void Main()
    {
        Process[] processes = Process.GetProcessesByName("notepad"); // "notepad"プロセスを検索

        foreach (Process process in processes)
        {
            process.Kill(); // プロセスを終了
            process.WaitForExit(); // 完全に終了するまで待機
        }
    }
}

ここではProcess.Killを使用して特定のプロセスを終了しているわ。ただし、この操作は破壊的だから注意してね。重要なプロセスを誤って終了しないように気をつけなさい。

プロパティを重点とした内容

次に、ProcessStartInfoを使用して、外部プロセスをより詳細に制御する方法を説明するわ。ここでは、コマンドライン引数を渡して特定のファイルを開く例を示すわね。

C#

// ProcessStartInfoを使用して特定のファイルを開く例
using System.Diagnostics;

class Program
{
    static void Main()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = "notepad.exe",      // 起動するプログラム
            Arguments = "example.txt",    // 開くファイルを指定
            UseShellExecute = true        // シェルを使用して起動
        };

        Process.Start(startInfo); // プロセスを起動
    }
}

このコードでは、メモ帳を起動し、指定したファイルを開くの。Argumentsプロパティでコマンドライン引数を渡せるのがポイントよ。

具体的な使い方 コマンドラインを渡して起動

ProcessStartInfoを使った、もう少し複雑な例を見てみましょう。ここでは、コマンドラインを渡して起動し、出力を読み取る方法を組み合わせているわ。

C#

// ProcessStartInfoで複数の操作を実行する例
using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = "/C echo Hello!", // コマンドを実行
            RedirectStandardOutput = true,        // 標準出力をリダイレクト
            UseShellExecute = false,              // シェルを使わずに実行
            CreateNoWindow = true                 // コンソールウィンドウを表示しない
        };

        Process process = new Process
        {
            StartInfo = startInfo
        };

        process.Start();

        string output = process.StandardOutput.ReadToEnd(); // 標準出力を読み取る
        process.WaitForExit(); // プロセスが終了するまで待機

        Console.WriteLine($"プロセスの出力: {output}");
    }
}

このコードでは、コマンドラインを使って文字列を出力し、その結果をプログラム内で取得しているわ。複雑な操作が必要な場合に役立つ方法ね。
ProcessStartInfoを使って標準出力をリダイレクトすることで、プロセスが生成する出力を取得しているの。この方法は、ログを分析したり、動的な結果を処理したりするのに便利よ。また、CreateNoWindowtrueにすることで、ユーザーに余計なウィンドウを表示させない設定も可能になるわ。

具体的な使い方2 管理者権限で起動

次に、管理者権限で起動する例を見てみましょう。

C#


using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        // 起動するプロセスの情報を設定
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "yourProgram.exe"; // 起動したいプログラムのパスを指定
        startInfo.Verb = "runas"; // 管理者権限で実行するための設定
        startInfo.UseShellExecute = true;

        try
        {
            // プロセスを起動
            Process process = Process.Start(startInfo);
            process.WaitForExit(); // プロセスが終了するまで待機
        }
        catch (System.ComponentModel.Win32Exception ex)
        {
            Console.WriteLine("管理者権限が拒否されました: " + ex.Message);
        }
    }
}

このコードは指定したプログラムを管理者権限で起動します。`ProcessStartInfo`クラスの`Verb`プロパティに`"runas"`を指定することで、管理者権限で実行するように設定しています。
なお、`yourProgram.exe`の部分を実際に起動したいプログラムのパスに置き換えてください。また、管理者権限が求められるため、ユーザーに確認ダイアログが表示される場合があります。

このブログを検索

QooQ