.NET অ্যাপ্লিকেশন (সি #) থেকে কনসোল আউটপুট ক্যাপচার করা হচ্ছে


130

আমি কীভাবে আমার .NET অ্যাপ্লিকেশন থেকে একটি কনসোল অ্যাপ্লিকেশন প্রার্থনা করব এবং কনসোলে উত্পন্ন সমস্ত আউটপুট ক্যাপচার করব?

(মনে রাখবেন, আমি কোনও ফাইলের মধ্যে তথ্যটি প্রথমে সংরক্ষণ করতে চাই না এবং তারপরে আমি লাইভ হিসাবে এটি পেতে পছন্দ করব বলেই পুনরায় চাপ দিন।)


প্রক্রিয়া.স্টার্টের সম্ভাব্য সদৃশ: আউটপুটটি কীভাবে পাবেন?
মাইকেল ফ্রিজিম

উভয় প্রশ্নের তারিখগুলি দেখুন এবং কোনটি "সদৃশ" তা দেখুন
গ্রিপসফট

"সম্ভাব্য সদৃশ" পরিষ্কার-আপ করার একটি উপায় - অনুরূপ প্রশ্নগুলি বন্ধ করতে এবং সেরা উত্তরের সাথে একটি রাখার জন্য। তারিখটি অত্যাবশ্যক নয়। দেখুন আরও নূতন এবং তারপরেও যুগোপযোগী উত্তর থাকা সত্ত্বেও, একটি সদৃশ প্রশ্ন বন্ধ করার জন্য আমার ভোট দেওয়া উচিত? যদি আপনি সম্মত হন যে এটির স্পষ্টতা দরকার তবে দয়া করে "সম্ভাব্য নকল" স্বয়ংক্রিয় মন্তব্যে স্পষ্টতা লিঙ্ক যুক্ত করুন
মাইকেল ফ্রেইজিম

উত্তর:


163

প্রসেসস্টার্টআইএনফো.রাইডাইরেক্টস স্ট্যান্ডার্ডআউটপুট সম্পত্তি ব্যবহার করে এটি বেশ সহজেই অর্জন করা যায় । লিঙ্কযুক্ত এমএসডিএন ডকুমেন্টেশনে একটি সম্পূর্ণ নমুনা রয়েছে; একমাত্র সতর্কতা হ'ল আপনার অ্যাপ্লিকেশনটির সমস্ত আউটপুট দেখতে আপনাকে স্ট্যান্ডার্ড ত্রুটি প্রবাহকে পুনর্নির্দেশ করতে হতে পারে।

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();

3
আপনি যদি অতিরিক্ত নতুন লাইনটি শেষে না চান তবে কেবল Console.Writeপরিবর্তে ব্যবহার করুন।
টিএম 1

2
এটি লক্ষ করা উচিত যে আপনি যদি কনসোল অ্যাপ্লিকেশনটির সাথে মিলিয়ে ReadToEnd () ব্যবহার করেন যা ব্যবহারকারীকে ইনপুট দেওয়ার জন্য অনুরোধ করার ক্ষমতা রাখে। উদাহরণস্বরূপ: ফাইলটি ওভাররাইট করুন: ওয়াই বা এন? ইত্যাদি তারপর ReadToEnd এর ফলে মেমরি ফাঁস হতে পারে, যেহেতু ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করার সময় প্রক্রিয়াটি কখনই শেষ হয় না। আউটপুট ক্যাপচার করার সবচেয়ে নিরাপদ উপায় হল প্রক্রিয়াটি ব্যবহার করা utআউটপুটডাটা প্রাপ্ত ইভেন্ট হ্যান্ডলার এবং প্রক্রিয়াটি আপনার আউটপুটটির অ্যাপ্লিকেশনটি প্রাপ্ত হওয়ার জন্য অবহিত করুন।
বালিওস

কম্পাইলার.স্টার্টআইএনফো.ফিলনাম = "csc.exe" যেহেতু কোডটি অ্যাজুরে ওয়েব অ্যাপে স্থাপন করা হয়েছে সে ক্ষেত্রে কীভাবে ক্যাপচার করবেন; না থাকতে পারে!
আসিফ ইকবাল

কম্পাইলার.স্টার্টআইএনফো.ফিলনাম = "csc.exe" যেহেতু কোডটি অ্যাজুরে ওয়েব অ্যাপে স্থাপন করা হয়েছে সে ক্ষেত্রে কীভাবে ক্যাপচার করবেন; না থাকতে পারে!
আসিফ ইকবাল

37

এটি @ এমডিবি থেকে গৃহীত উত্তরের তুলনায় কিছুটা উন্নতি । বিশেষত, আমরা প্রক্রিয়া ত্রুটি আউটপুট ক্যাপচার। অতিরিক্তভাবে, আমরা ইভেন্টগুলির মাধ্যমে এই আউটপুটগুলি ক্যাপচার করি কারণ ReadToEnd()আপনি ত্রুটি এবং নিয়মিত আউটপুট উভয়ই ক্যাপচার করতে চান তবে কাজ করে না । এই কাজটি করতে আমার সময় লেগেছে কারণ এটির BeginxxxReadLine()পরে আসলে কলগুলিও প্রয়োজন Start()

অ্যাসিনক্রোনাস উপায়:

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");
}

5
আপনাকে ধন্যবাদ, যুগ যুগ ধরে এটি খুঁজছিলেন!
সি বাউর

3
ধন্যবাদ. এটি নিখুঁত।
DrFloyd5

আমার আবেদনের ধন্যবাদ-তালিকায় আপনি সম্মানের জায়গা পাবেন।
মার্শ-উইগল

13

আপনার কনসোল প্রক্রিয়াটি তৈরি করার সময় আউটপুটটিকে পুনর্নির্দেশের জন্য প্রসেসইনফোর.ডাইরেক্টর স্ট্যান্ডার্ডআউটপুট ব্যবহার করুন ।

তারপরে আপনি প্রোগ্রাম আউটপুট পড়তে প্রসেস.স্ট্যান্ডার্ডআউটপুট ব্যবহার করতে পারেন ।

দ্বিতীয় লিঙ্কটিতে কীভাবে এটি করা যায় তার একটি নমুনা কোড রয়েছে।


7

কনসোলঅ্যাপলআনচার একটি ওপেন সোর্স লাইব্রেরি যা বিশেষত সেই প্রশ্নের উত্তর দেওয়ার জন্য তৈরি করা হয়। এটি কনসোলে উত্পন্ন সমস্ত আউটপুট ক্যাপচার করে এবং কনসোল অ্যাপ্লিকেশন শুরু এবং বন্ধ করার জন্য সহজ ইন্টারফেস সরবরাহ করে।

কনসোল দ্বারা স্ট্যান্ডার্ড / ত্রুটি আউটপুটে একটি নতুন লাইন লেখা থাকাকালীন প্রতিটি সময় কনসোল আউটপুট ইভেন্টটি বরখাস্ত করা হয়। লাইনগুলি সারিবদ্ধ এবং আউটপুট ক্রম অনুসরণ করার গ্যারান্টিযুক্ত।

নুগেট প্যাকেজ হিসাবেও উপলব্ধ ।

সম্পূর্ণ কনসোল আউটপুট পেতে নমুনা কল:

// 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();
}

2

আমি ও 2 প্ল্যাটফর্ম (ওপেন সোর্স প্রজেক্ট) -এ বেশ কয়েকটি সহায়ক পদ্ধতি যুক্ত করেছি যা আপনাকে কনসোল আউটপুট এবং ইনপুট মাধ্যমে অন্য প্রক্রিয়াটির সাথে সহজেই কোনও কথোপকথন স্ক্রিপ্ট করতে দেয় (দেখুন http://code.google.com/p/o2platform/ উত্স / ব্রাউজ / ট্রাঙ্ক / O2_Scriptts / APIs / উইন্ডোজ / CmdExe / CmdExeAPI.cs )

আপনার জন্যও দরকারী কার্যকর হতে পারে এমন এপিআই যা বর্তমান প্রক্রিয়ার কনসোল আউটপুট দেখার অনুমতি দেয় (বিদ্যমান নিয়ন্ত্রণ বা পপআপ উইন্ডোতে)। আরও তথ্যের জন্য এই ব্লগ পোস্টটি দেখুন: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (এই ব্লগে কীভাবে গ্রাস করতে হবে তার বিশদ রয়েছে নতুন প্রক্রিয়াগুলির কনসোল আউটপুট)


তার পর থেকে আমি কনসোল আউট ব্যবহার করার জন্য আরও সমর্থন যোগ করেছি (এই ক্ষেত্রে যদি আপনি। নেট নিজেকে নিজের প্রক্রিয়া শুরু করেন)। কটাক্ষপাত: C # এর REPL মধ্যে কনসোল আউটপুট কীভাবে ব্যবহার করতে হয় , একটি নেটিভ উইন্ডো হিসাবে VisualStudio আইডিই করতে 'কনসোল আউট' যোগ করার পদ্ধতি , দেখার 'কনসোল আউট বার্তা UserControls ভিতরে তৈরি
Dinis ক্রুজের

2

আমি একটি প্রতিক্রিয়াশীল সংস্করণ তৈরি করেছি যা stdOut এবং StdErr এর জন্য কলব্যাকগুলি গ্রহণ করে।
onStdOutএবং onStdErr, অ্যাসিঙ্ক্রোনাস বলা হয়
যত তাড়াতাড়ি ডাটা (প্রণালী থেকে প্রস্থান করার আগে) আসার হিসাবে।

public static Int32 RunProcess(String path,
                               String args,
                       Action<String> onStdOut = null,
                       Action<String> onStdErr = null)
    {
        var readStdOut = onStdOut != null;
        var readStdErr = onStdErr != null;

        var process = new Process
        {
            StartInfo =
            {
                FileName = path,
                Arguments = args,
                CreateNoWindow = true,
                UseShellExecute = false,
                RedirectStandardOutput = readStdOut,
                RedirectStandardError = readStdErr,
            }
        };

        process.Start();

        if (readStdOut) Task.Run(() => ReadStream(process.StandardOutput, onStdOut));
        if (readStdErr) Task.Run(() => ReadStream(process.StandardError, onStdErr));

        process.WaitForExit();

        return process.ExitCode;
    }

    private static void ReadStream(TextReader textReader, Action<String> callback)
    {
        while (true)
        {
            var line = textReader.ReadLine();
            if (line == null)
                break;

            callback(line);
        }
    }


ব্যবহারের উদাহরণ

নিম্নলিখিত এবং প্রিন্ট executableসঙ্গে চালানো হবেargs

  • সাদা সাদা
  • লাল মধ্যে স্টডিআর

কনসোল থেকে।

RunProcess(
    executable,
    args,
    s => { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(s); },
    s => { Console.ForegroundColor = ConsoleColor.Red;   Console.WriteLine(s); } 
);

1

পাইথনটিআর থেকে - পাইথন প্রোগ্রামারালারি ডের্নেই, ই-কিতাপ, আর্নেক :

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

যুক্ত 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;
        }
    }
}

আপনি যখন StandardOutput.ReadToEnd()এটি ব্যবহার করবেন অ্যাপ্লিকেশন শেষ না হওয়া পর্যন্ত এটি পরবর্তী বিবৃতিতে ফিরে আসবে না। সুতরাং ওয়েটফরেক্সট (টাইমআউটমিলিসেকেন্ডস) এ আপনার টাইমআউট কাজ করে না! (আপনার কোড স্তব্ধ হবে!)
S.Serpooshan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.