سؤال

أنا أعرف كيفية برمجة تطبيق وحدة التحكم مع المعلمات ، على سبيل المثال :myProgram.exe param1 param2.

سؤالي هو كيف يمكنني أن أجعل البرنامج يعمل مع |, مثال :صدى "word" | myProgram.exe?

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام Console.Read() و Console.ReadLine() كما لو كنت تقرأ إدخال المستخدم.أنابيب استبدال إدخال المستخدم بشفافية.لا يمكنك استخدام كلا بسهولة (على الرغم من أنني متأكد من الممكن جدا...).

تحرير:

بسيطة cat على غرار البرنامج:

class Program
{
    static void Main(string[] args)
    {
        string s;
        while ((s = Console.ReadLine()) != null)
        {
            Console.WriteLine(s);
        }

    }
}

و عند تشغيل كما هو متوقع ، فإن الإخراج:

C:\...\ConsoleApplication1\bin\Debug>echo "Foo bar baz" | ConsoleApplication1.exe
"Foo bar baz"

C:\...\ConsoleApplication1\bin\Debug>

نصائح أخرى

وفيما يلي لا تعليق طلب الإدخال ويعمل عندما تكون البيانات <م> أو لم يتم ضخها. قليلا من الإختراق. ونظرا لاصطياد الخطأ، والأداء يمكن أن يفتقر عندما يتم إجراء العديد من المكالمات الأنابيب ولكن ... سهلة.

public static void Main(String[] args)
{

    String pipedText = "";
    bool isKeyAvailable;

    try
    {
        isKeyAvailable = System.Console.KeyAvailable;
    }
    catch (InvalidOperationException expected)
    {
        pipedText = System.Console.In.ReadToEnd();
    }

    //do something with pipedText or the args
}

وفي. NET 4.5 انها

if (Console.IsInputRedirected)
{
    using(stream s = Console.OpenStandardInput())
    {
        ...

هذه هي الطريقة للقيام بذلك:

static void Main(string[] args)
{
    Console.SetIn(new StreamReader(Console.OpenStandardInput(8192))); // This will allow input >256 chars
    while (Console.In.Peek() != -1)
    {
        string input = Console.In.ReadLine();
        Console.WriteLine("Data read was " + input);
    }
}

هذا يسمح اثنين من استخدام الأساليب.قراءة من الإدخال القياسي:

C:\test>myProgram.exe
hello
Data read was hello

أو قراءة من الأنابيب الإدخال:

C:\test>echo hello | myProgram.exe
Data read was hello

وهنا هو حل بديل آخر التي تم وضعها معا من حلول أخرى بالإضافة إلى نظرة خاطفة ().

وبدون نظرة خاطفة () كنت تعاني بأن التطبيق لن يعود من دون السيطرة ج في نهاية عند القيام "نوع t.txt | prog.exe" حيث t.txt هو ملف متعدد الخطوط. ولكن فقط "prog.exe" أو "صدى مرحبا | prog.exe" عملت غرامة

.

ويهدف هذا الرمز إلى العملية الوحيدة الأنابيب الإدخال.

static int Main(string[] args)
{
    // if nothing is being piped in, then exit
    if (!IsPipedInput())
        return 0;

    while (Console.In.Peek() != -1)
    {
        string input = Console.In.ReadLine();
        Console.WriteLine(input);
    }

    return 0;
}

private static bool IsPipedInput()
{
    try
    {
        bool isKey = Console.KeyAvailable;
        return false;
    }
    catch
    {
        return true;
    }
}

وConsole.In هو إشارة إلى TextReader ملفوفة حول تيار الإدخال القياسي. عندما الأنابيب كميات كبيرة من البيانات إلى البرنامج، فإنه قد يكون من الأسهل للعمل مع بهذه الطريقة.

وهناك مشكلة مع المثال الموردة.

<اقتباس فقرة>
  while ((s = Console.ReadLine()) != null)

وسوف تمسك انتظار إدخال إذا تم إطلاق برنامج بدون بيانات الأنابيب. لذلك المستخدم لديه للضغط على أي مفتاح للخروج من البرنامج يدويا.

وهذا أيضا العمل من أجل

<اقتباس فقرة>   

ج: \ MyApp.exe

واضطررت الى استخدام ب StringBuilder لمعالجة المدخلات تم الاستيلاء عليها من ستدين:

public static void Main()
{
    List<string> salesLines = new List<string>();
    Console.InputEncoding = Encoding.UTF8;
    using (StreamReader reader = new StreamReader(Console.OpenStandardInput(), Console.InputEncoding))
    {
        string stdin;
        do
        {
            StringBuilder stdinBuilder = new StringBuilder();
            stdin = reader.ReadLine();
            stdinBuilder.Append(stdin);
            var lineIn = stdin;
            if (stdinBuilder.ToString().Trim() != "")
            {
                salesLines.Add(stdinBuilder.ToString().Trim());
            }

        } while (stdin != null);

    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top