web-dev-qa-db-ja.com

.NETアプリケーションからのコンソール出力のキャプチャ(C#)

.NETアプリケーションからコンソールアプリケーションを呼び出し、コンソールで生成されたすべての出力をキャプチャするにはどうすればよいですか?

(情報を最初にファイルに保存してから、ライブとして受信したいので再リストしたくないことに注意してください。)

119
Gripsoft

これは、 ProcessStartInfo.RedirectStandardOutput プロパティを使用して非常に簡単に実現できます。完全なサンプルは、リンクされたMSDNドキュメントに含まれています。唯一の注意点は、アプリケーションのすべての出力を表示するには、標準エラーストリームもリダイレクトする必要がある場合があることです。

Process compiler = new Process();
compiler.StartInfo.FileName = "csc.exe";
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();    

Console.WriteLine(compiler.StandardOutput.ReadToEnd());

compiler.WaitForExit();
155
mdb

これは、@ mdbからの受け入れられた回答よりも少し改善されています。具体的には、プロセスのエラー出力もキャプチャします。さらに、イベントを介してこれらの出力をキャプチャします。これは、bothエラーおよび通常の出力をキャプチャする場合、ReadToEnd()が機能しないためです。実際にStart()の後にBeginxxxReadLine()呼び出しも必要とするため、この作業を行うのに時間がかかりました。

using System.Diagnostics;

Process process = new Process();

void LaunchProcess()
{
    process.EnableRaisingEvents = true;
    process.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_OutputDataReceived);
    process.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_ErrorDataReceived);
    process.Exited += new System.EventHandler(process_Exited);

    process.StartInfo.FileName = "some.exe";
    process.StartInfo.Arguments = "param1 param2"
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardOutput = true;

    process.Start();
    process.BeginErrorReadLine();
    process.BeginOutputReadLine();          

    //below line is optional if we want a blocking call
    //process.WaitForExit();
}

void process_Exited(object sender, EventArgs e)
{
    Console.WriteLine(string.Format("process exited with code {0}\n", process.ExitCode.ToString()));
}

void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data + "\n");
}

void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data + "\n");
}
28
Shital Shah

ProcessInfo.RedirectStandardOutput を使用して、コンソールプロセスの作成時に出力をリダイレクトします。

次に、 Process.StandardOutput を使用して、プログラム出力を読み取ることができます。

2番目のリンクには、実行方法のサンプルコードがあります。

13
Franci Penov

ConsoleAppLauncher は、その質問に答えるために特別に作成されたオープンソースライブラリです。コンソールで生成されたすべての出力をキャプチャし、コンソールアプリケーションを起動および終了するためのシンプルなインターフェイスを提供します。

ConsoleOutputイベントは、コンソールによって標準/エラー出力に新しい行が書き込まれるたびに発生します。行はキューに入れられ、出力順序に従うことが保証されます。

NuGetパッケージ としても利用できます。

完全なコンソール出力を取得するためのサンプル呼び出し:

// Run simplest Shell command and return its output.
public static string GetWindowsVersion()
{
    return ConsoleApp.Run("cmd", "/c ver").Output.Trim();
}

ライブフィードバックを含むサンプル:

// Run ping.exe asynchronously and return roundtrip times back to the caller in a callback
public static void PingUrl(string url, Action<string> replyHandler)
{
    var regex = new Regex("(time=|Average = )(?<time>.*?ms)", RegexOptions.Compiled);
    var app = new ConsoleApp("ping", url);
    app.ConsoleOutput += (o, args) =>
    {
        var match = regex.Match(args.Line);
        if (match.Success)
        {
            var roundtripTime = match.Groups["time"].Value;
            replyHandler(roundtripTime);
        }
    };
    app.Run();
}
7
SlavaGu

process.StartInfo.**CreateNoWindow** = true;およびtimeoutを追加しました。

private static void CaptureConsoleAppOutput(string exeName, string arguments, int timeoutMilliseconds, out int exitCode, out string output)
{
    using (Process process = new Process())
    {
        process.StartInfo.FileName = exeName;
        process.StartInfo.Arguments = arguments;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.CreateNoWindow = true;
        process.Start();

        output = process.StandardOutput.ReadToEnd();

        bool exited = process.WaitForExit(timeoutMilliseconds);
        if (exited)
        {
            exitCode = process.ExitCode;
        }
        else
        {
            exitCode = -1;
        }
    }
}
2
Sergei Zinovyev

O2 Platform (オープンソースプロジェクト)に多くのヘルパーメソッドを追加しました。これにより、コンソールの出力と入力を介して別のプロセスとの対話を簡単にスクリプト化できます( http:/ /code.google.com/p/o2platform/source/browse/trunk/O2_Scripts/APIs/Windows/CmdExe/CmdExeAPI.cs

また、現在のプロセスのコンソール出力を(既存のコントロールまたはポップアップウィンドウで)表示できるAPIも便利です。詳細については、このブログ投稿を参照してください: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (このブログまた、新しいプロセスのコンソール出力を使用する方法の詳細が含まれています)

2
Dinis Cruz

FromPythonTR-PythonProgramcılarıDerneği、e-kitap、örnek

Process p = new Process();   // Create new object
p.StartInfo.UseShellExecute = false;  // Do not use Shell
p.StartInfo.RedirectStandardOutput = true;   // Redirect output
p.StartInfo.FileName = "c:\\python26\\python.exe";   // Path of our Python compiler
p.StartInfo.Arguments = "c:\\python26\\Hello_C_Python.py";   // Path of the .py to be executed
1
livetogogo