সি # তে কমান্ড লাইন যুক্তিগুলি পার্স করার সর্বোত্তম উপায়? [বন্ধ]


731

প্যারামিটারগুলি গ্রহণ করে এমন কনসোল অ্যাপ্লিকেশনগুলি তৈরি করার সময়, আপনি পাস হওয়া আর্গুমেন্টগুলি ব্যবহার করতে পারেন Main(string[] args)

অতীতে আমি এই অ্যারেটিকে কেবল সূচক / লুপ করেছি এবং মানগুলি বের করার জন্য কয়েকটি নিয়মিত প্রকাশ করেছি। তবে, যখন কমান্ডগুলি আরও জটিল হয়ে যায়, পার্সিংটি বেশ কুৎসিত হতে পারে।

সুতরাং আমি এতে আগ্রহী:

  • আপনি যে লাইব্রেরি ব্যবহার করেন
  • আপনি যে প্যাটার্নগুলি ব্যবহার করেন

ধরুন কমান্ডগুলি সর্বদা সাধারণ মান যেমন যেমন এখানে উত্তর দেওয়া হয় সেগুলি মেনে চলে ।


পূর্ববর্তী আলোচনা, স্প্লিট-স্ট্রিং-সহ-কমান্ড-লাইন-প্যারামিটারগুলি-স্ট্রিং-ইন-সি # , এর কিছু উত্তর থাকতে পারে।
জিমেল

1
হাই, দুঃখিত এটি কিছুটা অফ-টপিক। তবে আমি অ্যাপ্লিকেশনটিতে যুক্তি দিতে "অ্যাপ্লিকেশন সেটিংস" ব্যবহার করি না। আমি এটি ব্যবহার করা বেশ সহজ এবং আর্গুমেন্ট / ফাইল পার্সিং লেখার দরকার নেই এবং অতিরিক্ত লাইব্রেরির প্রয়োজন নেই বলে মনে করেছি। msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx
আমাকে স্টিভ

44
@ কল আমাকে স্টিভ: কমান্ড লাইন আর্গুমেন্টের বিন্দুটি হ'ল তারা কল প্রতি পৃথক হতে পারে - আপনি অ্যাপ্লিকেশন সেটিংস দিয়ে এটি কীভাবে করবেন?
পুনরায় পোস্টার

উত্তর:


324

আমি দৃD়ভাবে এনডেস্ক.অপশনগুলি ( ডকুমেন্টেশন ) এবং / অথবা মনো-অপশনগুলি (একই এপিআই, বিভিন্ন নামস্থান) ব্যবহার করার পরামর্শ দেবডকুমেন্টেশন থেকে একটি উদাহরণ :

bool show_help = false;
List<string> names = new List<string> ();
int repeat = 1;

var p = new OptionSet () {
    { "n|name=", "the {NAME} of someone to greet.",
       v => names.Add (v) },
    { "r|repeat=", 
       "the number of {TIMES} to repeat the greeting.\n" + 
          "this must be an integer.",
        (int v) => repeat = v },
    { "v", "increase debug message verbosity",
       v => { if (v != null) ++verbosity; } },
    { "h|help",  "show this message and exit", 
       v => show_help = v != null },
};

List<string> extra;
try {
    extra = p.Parse (args);
}
catch (OptionException e) {
    Console.Write ("greet: ");
    Console.WriteLine (e.Message);
    Console.WriteLine ("Try `greet --help' for more information.");
    return;
}

14
এনডেস্ক.ওপশন দুর্দান্ত, তবে একের অধিক স্বতন্ত্র কমান্ডের সাথে কনসোল অ্যাপ্লিকেশনগুলি সত্যই সমর্থন করে বলে মনে হচ্ছে না। যদি আপনি এটি চান, ম্যানডোনসোলটি চেষ্টা করুন যা এনডেস্কে গড়ে তোলে O বিভাগ: nuget.org/List/Packages/ManyConsole
ফ্রাঙ্ক শুইটারম্যান

5
যখন একাধিক স্বতন্ত্র কমান্ড সহ আমার একটি অ্যাপ থাকে আমি অপশনসেটগুলি "স্তর" করি। এমডোক নিন ( ডকস.গো-mono.com/index.aspx?link=man%3amdoc%281%29 ), যা একটি "গ্লোবাল" অপশনসেট ( github.com/mono/mono/blob/master/mcs/tools/ mdoc / ... ) যা প্রতি-কমান্ড OptionSet প্রতিনিধিদের (যেমন github.com/mono/mono/blob/master/mcs/tools/mdoc/... )
jonp

3
এনডেস্ক আমার পক্ষে কোনও কাজ করে না। পূর্ণসংখ্যার যুক্তিগুলি ঠিক আছে তবে স্ট্রিংগুলি পড়তে পারে। ভেরিয়েবলগুলি আর্গুমেন্টের মানগুলির (যেমন 'সার্ভারনাম', 'অ্যাপ্লিকেশননাম') এর পরিবর্তে আর্গুমেন্টগুলি (যেমন 's', 'এ' ইত্যাদি) পেতে থাকে। এর পরিবর্তে 'কমান্ড লাইন পার্সার লাইব্রেরি' দিয়েছিলেন এবং ব্যবহার করেছেন। ঠিক আছে এখন পর্যন্ত.
জে

2
@ অ্যাশলিহেন্ডারসন একটি বিষয় হিসাবে এটি ছোট এবং নমনীয়। সর্বাধিক সমাধান শুধুমাত্র ঐচ্ছিক নামে আর্গুমেন্ট (অর্থাত, মত ব্যবহার করতে পারবেন না সঙ্গে কাজ git checkout master), অথবা তাদের আর্গুমেন্ট নমনীয় নয় (অর্থাত, সমর্থন করে না --foo 123= --foo=123= -f 123= -f=123এবং -v -h= -vh)।
ওয়ার্নাইট

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

197

আমি সত্যিই কমান্ড লাইন পার্সার লাইব্রেরি পছন্দ করি ( http://commandline.codeplex.com/ )। বৈশিষ্ট্যের মাধ্যমে প্যারামিটার স্থাপনের এটির খুব সহজ এবং মার্জিত উপায় রয়েছে:

class Options
{
    [Option("i", "input", Required = true, HelpText = "Input file to read.")]
    public string InputFile { get; set; }

    [Option(null, "length", HelpText = "The maximum number of bytes to process.")]
    public int MaximumLenght { get; set; }

    [Option("v", null, HelpText = "Print details during execution.")]
    public bool Verbose { get; set; }

    [HelpOption(HelpText = "Display this help screen.")]
    public string GetUsage()
    {
        var usage = new StringBuilder();
        usage.AppendLine("Quickstart Application 1.0");
        usage.AppendLine("Read user manual for usage instructions...");
        return usage.ToString();
    }
}

6
এটি সেই লাইব্রেরি যা আমি স্থির করেছিলাম। আমি একটি বৃহত সংস্থার জন্য অ্যাপ্লিকেশন লিখছি যা বহু বছরের জন্য রক্ষণাবেক্ষণ করা দরকার - এই লাইব্রেরিটি ২০০৫ সাল থেকে ধারাবাহিকভাবে আপডেট হয়েছে, জনপ্রিয় বলে মনে হচ্ছে, এটি সি # সম্প্রদায়ের সক্রিয় লোকেরা লিখেছেন এবং বিএসডি স্টাইলে লাইসেন্স পেয়েছেন সমর্থন বিনষ্ট হয়।
চার্লস বার্নস

আমি এটি সুপারিশ। আমার একমাত্র সমস্যাটি ছিল: অনুমোদিত তর্কযুক্ত সংমিশ্রণ নির্দিষ্টকরণ (উদাহরণস্বরূপ যদি সরল তর্ক থাকলে অবশ্যই উত্স এবং গন্তব্য যুক্তি থাকতে হবে ) বৈশিষ্ট্যগুলি সহ সম্ভব হতে পারে। তবে আপনি সম্ভবত পৃথক যুক্তি বৈধ প্রমাণকারী যুক্তি দিয়ে এটি করা ভাল
লন্ডন হোয়াইট

1
আমি বিকল্প ক্লাস পছন্দ করি। দেখে মনে হচ্ছে এটি নামবিহীন প্যারামিটার এবং পতাকাও পছন্দ --recursiveকরে।
ওয়ার্নাইট

2
আমি এটি পরীক্ষা করেছি এবং মাত্র কয়েক মিনিটের মধ্যে আমি আমার অ্যাপ্লিকেশনটির বিকল্প প্রয়োগ করেছি। এটি লাইব্রেরি ব্যবহার করা অত্যন্ত সহজ।
ত্রিসমেজিস্টোস

3
আমি এই লাইব্রেরিটি নিজের জন্য খুব সীমাবদ্ধ বলে মনে করি। যদি আপনার একচেটিয়া সেট দরকার হয় তবে আপনি প্রতিটি সেটের জন্য প্রয়োজনীয় বিকল্পগুলি সংজ্ঞায়িত করতে পারবেন না, তাই সেগুলি ম্যানুয়ালি পরীক্ষা করে দেখতে হবে। নামবিহীন মানগুলির জন্য আপনি ন্যূনতম প্রয়োজনীয়তা নির্ধারণ করতে পারবেন না, আপনাকে সেগুলি নিজেও পরীক্ষা করতে হবে। স্ক্রিন নির্মাতাকে সহায়তাও মোটেই নমনীয় নয়। লাইব্রেরির আচরণ যদি আপনার প্রয়োজনীয়তাগুলি বাক্সের বাইরে ফিট করে না, তবে আপনি এটি পরিবর্তন করতে কার্যত কিছুই করতে পারবেন না।
সের্গে কোস্তরভকভ

50

WPF TestApi গ্রন্থাগার C # এর উন্নয়নের জন্য সুন্দরটি কমান্ড লাইন পারজার এক সঙ্গে আসে। আমি এপিআইয়ের আইভো মনোলভের ব্লগ থেকে এটি সবিস্তারে দেখার পরামর্শ দিচ্ছি :

// EXAMPLE #2:
// Sample for parsing the following command-line:
// Test.exe /verbose /runId=10
// This sample declares a class in which the strongly-
// typed arguments are populated
public class CommandLineArguments
{
   bool? Verbose { get; set; }
   int? RunId { get; set; }
}

CommandLineArguments a = new CommandLineArguments();
CommandLineParser.ParseArguments(args, a);

19
+1 টি। কমান্ড-লাইন পার্সিং হ'ল এমন কিছু যা প্রকৃতপক্ষে কোনও তৃতীয় পক্ষের সরঞ্জামের পরিবর্তে বিক্রেতার (অর্থাত্ মাইক্রোসফ্ট) থেকে আসা উচিত, এমনকি যদি বিক্রেতার সমর্থনটি চূড়ান্তভাবে আসে।
জোয়েল কোহোর্ন

2
এটি বলেছিল, গৃহীত উত্তর (মনো) পরবর্তী সেরা জিনিস।
জোয়েল কোহোর্ন

6
@ জোয়েল, কমান্ড লাইনটি পার্সিংটি বিক্রেতার কাছ থেকে আসা কতটা গুরুত্বপূর্ণ? আপনার কারণ কি?
গ্রীনল্ডম্যান

3
@মারসিয়াস: আমার মনে হয় তার অর্থ সম্ভবত বাক্সের বাইরে হওয়া উচিত ছিল ... অনেক কিছুর মতো :)
ব্যবহারকারীর 1111

গ্রন্থাগারটি বিশাল! আমার প্রয়োজনের চেয়ে অনেক বেশি এতে রয়েছে ...
রিরি

24

2
এনডেস্ক বিকল্পগুলির একটি খুব সুন্দর এপিআই রয়েছে
ব্যবহারকারী 35149

2
আমি এনডেস্কের জন্য এটির পক্ষে আরও একটি ভোট যুক্ত করব এটি ভাল কাজ করে, এটি হস্তক্ষেপহীন এবং ভাল নথিভুক্ত।
টেরেন্স

1
মনো.গেটঅপশনগুলি অনেক পুরানো, এনডেস্ক.অপশনগুলি খুব সুন্দর (বা মনো.অপশনগুলি যদি আপনি পছন্দ করেন তবে এটি একই শ্রেণি, এখানে: anonsvn.mono-project.com/source/trunk/mcs/class/Mono.Options/… )
ম্যাট এনরাট

7
@ অ্যাডাম ওরেন: আমার উত্তরটি 1 বছর 1 মাস বয়সী! মনো ট্রাঙ্কের কাঠামো রিফ্যাক্টর হয়েছিল। এই কোডটি এখন anonsvn.mono-project.com/viewvc/branches/mono-2-2/mcs/class/…
abatishchev

6
@ টর্মোড: এটি মনো.গেটপশন যা অপ্রচলিত, মনো-অপশন নয়। Mono.Options এখনও বজায় রাখা হয়।
jonp

14

দেখে মনে হচ্ছে প্রত্যেকের নিজস্ব পোষ্য কমান্ড-লাইন পার্সার রয়েছে, চিত্রটি আমারও ভালভাবে যুক্ত হয়েছিল :)।

http://bizark.codeplex.com/

এই লাইব্রেরিতে একটি কমান্ড-লাইন পার্সার রয়েছে যা কমান্ড-লাইন থেকে মানগুলি সহ একটি শ্রেণীর সূচনা করবে। এটির অনেকগুলি বৈশিষ্ট্য রয়েছে (আমি এটি বহু বছর ধরে তৈরি করছি)।

ডকুমেন্টেশন থেকে ...

বিজআর্ক ফ্রেমওয়ার্কে কমান্ড-লাইন পার্সিংয়ের এই মূল বৈশিষ্ট্যগুলি রয়েছে:

  • স্বয়ংক্রিয় সূচনা: শ্রেণীর বৈশিষ্ট্যগুলি স্বয়ংক্রিয়ভাবে কমান্ড-লাইন আর্গুমেন্টের ভিত্তিতে সেট করা হয়।
  • ডিফল্ট বৈশিষ্ট্য: সম্পত্তির নাম উল্লেখ না করে কোনও মান প্রেরণ করুন।
  • মান রূপান্তর: মানগুলিকে যথাযথ ধরণের রূপান্তর করতে বিজআর্ককে অন্তর্ভুক্ত শক্তিশালী রূপান্তরকারী শ্রেণিটি ব্যবহার করে।
  • বুলিয়ান পতাকা: পতাকাগুলি কেবল আর্গুমেন্ট ব্যবহার করে (প্রাক্তন, / বি সত্য এবং / বি- মিথ্যা জন্য) ব্যবহার করে বা সত্য / মিথ্যা, হ্যাঁ / না, ইত্যাদি যোগ করে নির্দিষ্ট করা যায় gs
  • আর্গুমেন্ট অ্যারে: অ্যারে হিসাবে সংজ্ঞায়িত একটি সম্পত্তি সেট করতে কেবল কমান্ড-লাইন নামের পরে একাধিক মান যুক্ত করুন। প্রাক্তন, / x 1 2 3 অ্যারে x 1, 2, 3} (x অনুমান করে যে পূর্ণসংখ্যার অ্যারে হিসাবে সংজ্ঞায়িত করা হয়েছে) দিয়ে এক্সকে জনবহুল করবে।
  • কমান্ড-লাইন উপাধি: একটি সম্পত্তি এটির জন্য একাধিক কমান্ড-লাইন উপাত্ত সমর্থন করতে পারে। উদাহরণস্বরূপ, সহায়তা উপন্যাসটি ব্যবহার করে?
  • আংশিক নামের স্বীকৃতি: আপনার পুরো নাম বা উপন্যাসটি বানান করার দরকার নেই, পার্সারকে অন্যের কাছ থেকে সম্পত্তি / উপন্যাসটি বিচ্ছিন্ন করার জন্য যথেষ্ট পরিমাণ বানান।
  • ক্লিকঅনস সমর্থন করে: ক্লিকও ওয়ান্স মোতায়েন অ্যাপ্লিকেশনগুলির জন্য ইউআরএলটিতে কোয়েরি স্ট্রিং হিসাবে নির্দিষ্ট করা থাকলেও বৈশিষ্ট্যগুলি আরম্ভ করতে পারে। কমান্ড-লাইন ইনিশিয়ালাইজেশন পদ্ধতিটি এটি ক্লিকঅনস হিসাবে চলমান কিনা তা সনাক্ত করবে বা আপনার কোড ব্যবহার করার সময় এটি পরিবর্তন করার প্রয়োজন হবে না।
  • স্বয়ংক্রিয়ভাবে তৈরি করে /? সহায়তা: এটিতে দুর্দান্ত ফর্ম্যাটিং রয়েছে যা কনসোলটির প্রস্থকে বিবেচনা করে।
  • কোনও ফাইলে কমান্ড-লাইন যুক্তিগুলি লোড করুন / সংরক্ষণ করুন: এটি বিশেষত কার্যকর যদি আপনার একাধিক বৃহত, জটিল কমান্ড-লাইন আর্গুমেন্টের সেট থাকে যা আপনি একাধিকবার চালাতে চান।

2
আমি বিজার্কের কমান্ড-লাইন পার্সারটিকে অন্যদের তুলনায় অনেক বেশি সহজ এবং সাবলীল পেয়েছি। অত্যন্ত বাঞ্ছনীয়!
বোরিস মোডিলেভস্কি


9

CLAP (কমান্ড লাইন আর্গুমেন্ট পার্সার) এর একটি ব্যবহারযোগ্য API রয়েছে এবং আশ্চর্যরূপে নথিভুক্ত। আপনি প্যারামিটারগুলি বারণ করে একটি পদ্ধতি তৈরি করেন। https://github.com/adrianaisemberg/CLAP


2
এটি ব্যবহার করা খুব সহজ এবং তাদের ওয়েবসাইট শিলা। তাদের বাক্য গঠনটি খুব স্বজ্ঞাত নয়: myapp myverb -argname argvalue(অবশ্যই থাকতে হবে -argname) বা myapp -help(সাধারণত --help)।
ওয়ার্নাইট

@ ওয়ার্নাইটে আপনি ভার্ডে ইসডেফল্ট প্যারামিটার ব্যবহার করতে পারেন যে এটি বাদ দেওয়া যেতে পারে। আমি পজিশনাল প্যারামিটারগুলির জন্য সমর্থন পাইনি, তবে আমি কেবলমাত্র পজিশনাল প্যারামিটার ব্যবহার করেছি যখন আমি নিজে কমান্ড লাইনটি বিশ্লেষণ করছিলাম। আইএমএইচও মান অনুসারে নামযুক্ত যুক্তি ব্যবহার করা আরও পরিষ্কার।
লাউডেনভিয়ার

5

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

প্রথমটি হ'ল আর্গুমেন্টলিস্ট যা কেবলমাত্র কমান্ড লাইন প্যারামিটারগুলি পার্স করার জন্য দায়বদ্ধ। এটি সুইচগুলি '/ x: y' বা '-x = y' দ্বারা সংজ্ঞায়িত নাম-মান জোড়া সংগ্রহ করে এবং 'নামবিহীন' এন্ট্রিগুলির একটি তালিকাও সংগ্রহ করে। এটির মৌলিক ব্যবহারটি এখানে আলোচনা করা হয়েছে , এখানে শ্রেণি দেখুন

এর দ্বিতীয় অংশটি হ'ল কমান্ডইনটারপ্রেটার যা আপনার। নেট ক্লাসের বাইরে সম্পূর্ণরূপে কার্যকরী কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করে। উদাহরণ হিসাবে:

using CSharpTest.Net.Commands;
static class Program
{
    static void Main(string[] args)
    {
        new CommandInterpreter(new Commands()).Run(args);
    }
    //example ‘Commands’ class:
    class Commands
    {
        public int SomeValue { get; set; }
        public void DoSomething(string svalue, int ivalue)
        { ... }

উপরের উদাহরণ কোড সহ আপনি নিম্নলিখিত চালাতে পারেন:

প্রোগ্রাম.এক্সে ডোজ কিছু "স্ট্রিংয়ের মান" 5

- বা -

প্রোগ্রাম.এক্সে ডোজোমথিং / ivueue = 5-মূল্য: "স্ট্রিং মান"

এটি যতটা সহজ আপনি যতটা জটিল প্রয়োজন তত জটিল। আপনি করতে পারেন সোর্স কোড পর্যালোচনা , সাহায্যের দেখতে , বা বাইনারি ডাউনলোড


4

আমি এটি পছন্দ করি , কারণ আপনি যুক্তিগুলির জন্য "বিধিগুলি সংজ্ঞায়িত" করতে পারেন, প্রয়োজন বা নাও, ...

অথবা আপনি যদি ইউনিক্সের লোক হন তবে আপনার চেয়ে জিএনইউ গেটোপট। নেট বন্দরটি পছন্দ।


4

আপনি আমার এক রাগ.সিএমডি পছন্দ করতে পারেন

সহজেই ব্যবহারযোগ্য এবং প্রসারণযোগ্য কমান্ড লাইন আর্গুমেন্ট পার্সার। হ্যান্ডলগুলি: বুল, প্লাস / মাইনাস, স্ট্রিং, স্ট্রিং লিস্ট, সিএসভি, গণনা।

'/?' এ নির্মিত? সহায়তা মোড।

'/ ??' এ অন্তর্নির্মিত এবং '/? ডি' নথি জেনারেটর মোড।

static void Main(string[] args) 
{            
    // create the argument parser
    ArgumentParser parser = new ArgumentParser("ArgumentExample", "Example of argument parsing");

    // create the argument for a string
    StringArgument StringArg = new StringArgument("String", "Example string argument", "This argument demonstrates string arguments");

    // add the argument to the parser 
    parser.Add("/", "String", StringArg);

    // parse arguemnts
    parser.Parse(args);

    // did the parser detect a /? argument 
    if (parser.HelpMode == false) 
    {
        // was the string argument defined 
        if (StringArg.Defined == true)
        {
            // write its value
            RC.WriteLine("String argument was defined");
            RC.WriteLine(StringArg.Value);
        }
    }
}

সম্পাদনা করুন: এটি আমার প্রকল্প এবং এই উত্তরটিকে তৃতীয় পক্ষের সমর্থন হিসাবে দেখা উচিত নয়। এটি বলেছিল যে আমি এটি লিখি প্রতিটি কমান্ড লাইন ভিত্তিক প্রোগ্রামের জন্য এটি ব্যবহার করি, এটি ওপেন সোর্স এবং এটি আমার আশা যে এটির দ্বারা অন্যরা উপকৃত হবেন।


শুধু একটি অবগতির জন্য, যে আপনি একটি সামান্য দাবিত্যাগ আপনি Rug.Cmd প্রজেক্ট (প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী উল্লেখ হিসাবে) সঙ্গে সম্বন্ধযুক্ত করা হয় করা উচিত: stackoverflow.com/faq#promotion - না একটি বড় চুক্তি যেহেতু আপনি একটি open- প্রচার উত্স প্রকল্প, তবে এটি এখনও অস্বীকৃতি যুক্ত করা ভাল;) +1 যাইহোক ... দেখতে বেশ সুন্দর হয়েছে।
জেসন ডাউন

এটি উল্লেখ করার জন্য চিয়ারস এবং +1 এর জন্য ধন্যবাদ, আমি নিশ্চিত করব যে আমি আমার অধিভুক্তি সম্পর্কে আরও স্পষ্ট।
ফিল তেউ

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

3

Http://www.codeplex.com/commonlibrarynet এ একটি কমান্ড লাইন আর্গুমেন্ট পার্সার রয়েছে

এটি
১ টি গুণাবলী ব্যবহার করে যুক্তিগুলি পার্স করতে পারে
2. সুস্পষ্ট কল
3.. একাধিক যুক্তি বা স্ট্রিং অ্যারের একক লাইন

এটি নিম্নলিখিতগুলির মতো জিনিসগুলি পরিচালনা করতে পারে:

- কনফিগার : - স্টার্ট তারিখ : $ { আজ } - অঞ্চল : 'নিউ ইয়র্ক' সেটিংস 01

এটি ব্যবহার করা খুব সহজ।


2

এটি নভেল Optionsক্লাসের উপর ভিত্তি করে আমি লিখেছি এমন একটি হ্যান্ডলার ।

এটির জন্য একটি কনসোল অ্যাপ্লিকেশনগুলির লক্ষ্য যা একটি while (input !="exit")স্টাইল লুপ চালায় , উদাহরণস্বরূপ একটি FTP কনসোলের মতো একটি ইন্টারেক্টিভ কনসোল।

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

static void Main(string[] args)
{
    // Setup
    CommandHandler handler = new CommandHandler();
    CommandOptions options = new CommandOptions();

    // Add some commands. Use the v syntax for passing arguments
    options.Add("show", handler.Show)
        .Add("connect", v => handler.Connect(v))
        .Add("dir", handler.Dir);

    // Read lines
    System.Console.Write(">");
    string input = System.Console.ReadLine();

    while (input != "quit" && input != "exit")
    {
        if (input == "cls" || input == "clear")
        {
            System.Console.Clear();
        }
        else
        {
            if (!string.IsNullOrEmpty(input))
            {
                if (options.Parse(input))
                {
                    System.Console.WriteLine(handler.OutputMessage);
                }
                else
                {
                    System.Console.WriteLine("I didn't understand that command");
                }

            }

        }

        System.Console.Write(">");
        input = System.Console.ReadLine();
    }
}

এবং উত্স:

/// <summary>
/// A class for parsing commands inside a tool. Based on Novell Options class (http://www.ndesk.org/Options).
/// </summary>
public class CommandOptions
{
    private Dictionary<string, Action<string[]>> _actions;
    private Dictionary<string, Action> _actionsNoParams;

    /// <summary>
    /// Initializes a new instance of the <see cref="CommandOptions"/> class.
    /// </summary>
    public CommandOptions()
    {
        _actions = new Dictionary<string, Action<string[]>>();
        _actionsNoParams = new Dictionary<string, Action>();
    }

    /// <summary>
    /// Adds a command option and an action to perform when the command is found.
    /// </summary>
    /// <param name="name">The name of the command.</param>
    /// <param name="action">An action delegate</param>
    /// <returns>The current CommandOptions instance.</returns>
    public CommandOptions Add(string name, Action action)
    {
        _actionsNoParams.Add(name, action);
        return this;
    }

    /// <summary>
    /// Adds a command option and an action (with parameter) to perform when the command is found.
    /// </summary>
    /// <param name="name">The name of the command.</param>
    /// <param name="action">An action delegate that has one parameter - string[] args.</param>
    /// <returns>The current CommandOptions instance.</returns>
    public CommandOptions Add(string name, Action<string[]> action)
    {
        _actions.Add(name, action);
        return this;
    }

    /// <summary>
    /// Parses the text command and calls any actions associated with the command.
    /// </summary>
    /// <param name="command">The text command, e.g "show databases"</param>
    public bool Parse(string command)
    {
        if (command.IndexOf(" ") == -1)
        {
            // No params
            foreach (string key in _actionsNoParams.Keys)
            {
                if (command == key)
                {
                    _actionsNoParams[key].Invoke();
                    return true;
                }
            }
        }
        else
        {
            // Params
            foreach (string key in _actions.Keys)
            {
                if (command.StartsWith(key) && command.Length > key.Length)
                {

                    string options = command.Substring(key.Length);
                    options = options.Trim();
                    string[] parts = options.Split(' ');
                    _actions[key].Invoke(parts);
                    return true;
                }
            }
        }

        return false;
    }
}

2

আমার ব্যক্তিগত প্রিয়টি হ'ল পিটার পালোটাসের http://www.codeproject.com/KB/recips/plossum_commandline.aspx :

[CommandLineManager(ApplicationName="Hello World",
    Copyright="Copyright (c) Peter Palotas")]
class Options
{
   [CommandLineOption(Description="Displays this help text")]
   public bool Help = false;

   [CommandLineOption(Description = "Specifies the input file", MinOccurs=1)]
   public string Name
   {
      get { return mName; }
      set
      {
         if (String.IsNullOrEmpty(value))
            throw new InvalidOptionValueException(
                "The name must not be empty", false);
         mName = value;
      }
   }

   private string mName;
}

2

আমি সম্প্রতি ফুবুকোর কমান্ড লাইনটি পার্সিং বাস্তবায়ন পেরিয়ে এসেছি যা সত্যিই আমার পছন্দ হয়েছে, কারণগুলি:

  • এটি ব্যবহার করা সহজ - যদিও আমি এর জন্য কোনও ডকুমেন্টেশন পাইনি, ফুবুকোর সমাধান ইউনিট টেস্টের একটি দুর্দান্ত সেট রয়েছে যা কোনও ডকুমেন্টেশনের চেয়ে কার্যকারিতা সম্পর্কে আরও বেশি কথা বলার ব্যবস্থা করে provides
  • এটিতে একটি দুর্দান্ত অবজেক্ট ওরিয়েন্টেড ডিজাইন রয়েছে, কোনও কোডের পুনরাবৃত্তি বা এই জাতীয় কিছু নেই যা আমি আমার কমান্ড লাইনে পার্সিং অ্যাপগুলিতে করতাম
  • এটি ঘোষণামূলক: আপনি মূলত কমান্ড এবং পরামিতিগুলির সেটগুলির জন্য ক্লাস লেখেন এবং বিভিন্ন বিকল্প নির্ধারণের জন্য গুণাবলী সহ তাদের সাজাইয়া রাখুন (যেমন নাম, বিবরণ, বাধ্যতামূলক / alচ্ছিক)
  • এমনকি লাইব্রেরি এই সংজ্ঞাগুলির উপর ভিত্তি করে একটি দুর্দান্ত ইউজ গ্রাফ প্রিন্ট করে

এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে নীচে একটি সাধারণ উদাহরণ দেওয়া আছে। ব্যবহারটি চিত্রিত করার জন্য, আমি একটি সাধারণ ইউটিলিটি লিখেছি যার দুটি কমান্ড রয়েছে: - যুক্ত করুন (একটি তালিকায় একটি অবজেক্ট যুক্ত করুন - কোনও বস্তুর একটি নাম (স্ট্রিং), মান (int) এবং একটি বুলিয়ান পতাকা রয়েছে) - তালিকা (তালিকা সমস্ত বর্তমানে যুক্ত করা বস্তু)

প্রথমত, আমি 'অ্যাড' কমান্ডের জন্য একটি কমান্ড ক্লাস লিখেছিলাম:

[Usage("add", "Adds an object to the list")]
[CommandDescription("Add object", Name = "add")]
public class AddCommand : FubuCommand<CommandInput>
{
    public override bool Execute(CommandInput input)
    {
        State.Objects.Add(input); // add the new object to an in-memory collection

        return true;
    }
}

এই কমান্ডটি একটি কমান্ড ইনপুট উদাহরণটিকে প্যারামিটার হিসাবে গ্রহণ করে, তাই আমি এটি পরবর্তীটি সংজ্ঞায়িত করি:

public class CommandInput
{
    [RequiredUsage("add"), Description("The name of the object to add")]
    public string ObjectName { get; set; }

    [ValidUsage("add")]
    [Description("The value of the object to add")]
    public int ObjectValue { get; set; }

    [Description("Multiply the value by -1")]
    [ValidUsage("add")]
    [FlagAlias("nv")]
    public bool NegateValueFlag { get; set; }
}

পরবর্তী কমান্ডটি হল 'তালিকা', যা নিম্নলিখিত হিসাবে প্রয়োগ করা হয়:

[Usage("list", "List the objects we have so far")]
[CommandDescription("List objects", Name = "list")]
public class ListCommand : FubuCommand<NullInput>
{
    public override bool Execute(NullInput input)
    {
        State.Objects.ForEach(Console.WriteLine);

        return false;
    }
}

'List' কমান্ডটি কোনও প্যারামিটার নেয় না, সুতরাং আমি এর জন্য একটি নুলিনপুট শ্রেণি সংজ্ঞায়িত করেছি:

public class NullInput { }

এখন যা যা রয়েছে তা হ'ল মূল () পদ্ধতিতে এটিকে তারযুক্ত করা:

    static void Main(string[] args)
    {
        var factory = new CommandFactory();
        factory.RegisterCommands(typeof(Program).Assembly);

        var executor = new CommandExecutor(factory);

        executor.Execute(args);
    }

প্রোগ্রামটি প্রত্যাশিত হিসাবে কাজ করে, কোনও আদেশ কমান্ড অবৈধ হলে সঠিক ব্যবহার সম্পর্কে ইঙ্গিতগুলি মুদ্রণ করে:

  ------------------------
    Available commands:
  ------------------------
     add -> Add object
    list -> List objects
  ------------------------

এবং 'অ্যাড' কমান্ডের জন্য একটি নমুনা ব্যবহার:

Usages for 'add' (Add object)
  add <objectname> [-nv]

  -------------------------------------------------
    Arguments
  -------------------------------------------------
     objectname -> The name of the object to add
    objectvalue -> The value of the object to add
  -------------------------------------------------

  -------------------------------------
    Flags
  -------------------------------------
    [-nv] -> Multiply the value by -1
  -------------------------------------

2

পাওয়ারশেল কমান্ডলেটস

কমান্ডলেটগুলিতে উল্লিখিত বৈশিষ্ট্যগুলির ভিত্তিতে পাওয়ারশেলের মাধ্যমে পার্সিং, বৈধতাগুলির জন্য সমর্থন, প্যারামিটার সেট, পাইপলাইনিং, ত্রুটি প্রতিবেদনকরণ, সহায়তা এবং অন্যান্য কমান্ডলেটে ব্যবহারের জন্য NET অবজেক্টগুলির মধ্যে সেরা।

একটি দম্পতি লিঙ্কগুলি আমাকে শুরু করতে সহায়ক বলে মনে হয়েছে:


2

সি # সি এল আই একটি খুব সাধারণ কমান্ড-লাইন আর্গুমেন্ট পার্সিং লাইব্রেরি যা আমি লিখেছিলাম। এটি ভাল-ডকুমেন্টেড এবং ওপেন সোর্স।


তথ্যসমৃদ্ধ? ডকুমেন্টেশন কোথায়?
সুহাস

অভ্যন্তরীণ ডকুমেন্টেশন রয়েছে (যেমন কোডবেসে) পাশাপাশি বাহ্যিক ডকুমেন্টেশন ( ফোল্ডারে Readme.mkdফাইলটি দেখুন Documentation)।
বার্নার্ড

ঠিক আছে, আমি তাড়াহুড়ো করে মন্তব্য করেছি। আপনি আপনার প্রকল্পটি গিথুবে স্থানান্তর করতে পারেন এবং আপনার ডকুমেন্টেশনগুলি স্বয়ংক্রিয়ভাবে হোম পৃষ্ঠায় প্রদর্শিত হতে শুরু করে।
সুহাস

1

চেঙ্গিস কমান্ড লাইন পার্সারটি কিছুটা পুরানো হতে পারে তবে এটি অত্যন্ত বৈশিষ্ট্যযুক্ত এবং আমার পক্ষে বেশ ভালভাবে কাজ করে।


দুঃখিত, তবে চেঙ্গিস কমান্ড লাইন পার্সারের কোনও ডকুমেন্টেশন নেই।
ওকিগান

আপনি যদি উত্সগুলি লক্ষ্য করেন তবে সেখানে নমুনা রয়েছে যা ব্যবহারের বিকল্পগুলি দেখায়। genghis.codeplex.com/SourceControl/changeset/view/9491#73699
দেবদিমি

0

আমি ওপেন-সোর্স লাইব্রেরি CSharpOptParse পরামর্শ করব । এটি কমান্ড লাইনটি পার্স করে এবং একটি ব্যবহারকারী-সংজ্ঞায়িত .NET অবজেক্টটি কমান্ড-লাইন ইনপুট দিয়ে হাইড্রেট করে। সি # কনসোল অ্যাপ্লিকেশন লেখার সময় আমি সর্বদা এই লাইব্রেরিতে ফিরে যাই।



0

কমান্ড লাইন পার্সিংয়ের জন্য অ্যাডহক ক্লাসটি ব্যবহার করা খুব সহজ, এটি ডিফল্ট যুক্তি সমর্থন করে।

class CommandLineArgs
{
    public static CommandLineArgs I
    {
        get
        {
            return m_instance;
        }
    }

    public  string argAsString( string argName )
    {
        if (m_args.ContainsKey(argName)) {
            return m_args[argName];
        }
        else return "";
    }

    public long argAsLong(string argName)
    {
        if (m_args.ContainsKey(argName))
        {
            return Convert.ToInt64(m_args[argName]);
        }
        else return 0;
    }

    public double argAsDouble(string argName)
    {
        if (m_args.ContainsKey(argName))
        {
            return Convert.ToDouble(m_args[argName]);
        }
        else return 0;
    }

    public void parseArgs(string[] args, string defaultArgs )
    {
        m_args = new Dictionary<string, string>();
        parseDefaults(defaultArgs );

        foreach (string arg in args)
        {
            string[] words = arg.Split('=');
            m_args[words[0]] = words[1];
        }
    }

    private void parseDefaults(string defaultArgs )
    {
        if ( defaultArgs == "" ) return;
        string[] args = defaultArgs.Split(';');

        foreach (string arg in args)
        {
            string[] words = arg.Split('=');
            m_args[words[0]] = words[1];
        }
    }

    private Dictionary<string, string> m_args = null;
    static readonly CommandLineArgs m_instance = new CommandLineArgs();
}

class Program
{
    static void Main(string[] args)
    {
        CommandLineArgs.I.parseArgs(args, "myStringArg=defaultVal;someLong=12");
        Console.WriteLine("Arg myStringArg  : '{0}' ", CommandLineArgs.I.argAsString("myStringArg"));
        Console.WriteLine("Arg someLong     : '{0}' ", CommandLineArgs.I.argAsLong("someLong"));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.