2008-09-20 9 views
32

के कार्यान्वयन के लिए सुझाव मैं एक कमांड लाइन एप्लिकेशन को फिर से डिजाइन कर रहा हूं और इसका उपयोग अधिक सहज बनाने के लिए एक तरीका ढूंढ रहा हूं। क्या कमांड लाइन एप्लिकेशन में पारित पैरामीटर के प्रारूप के लिए कोई सम्मेलन है? या किसी भी अन्य विधि जिसे लोगों ने उपयोगी पाया है?कमांड लाइन इंटरफ़ेस

+5

यह जानने में मदद कर सकता है कि आप किस पर्यावरण को लक्षित कर रहे हैं। – dmckee

उत्तर

26

मुझे बहुत से विंडोज कमांड लाइन विनिर्देश दिखाई देते हैं, लेकिन यदि आपका प्रोग्राम लिनक्स के लिए है, तो मुझे सबसे सहज ज्ञान युक्त GNU command line standard मिल गया है। असल में, यह कमांड के लंबे रूप (उदा।, --help) और छोटे संस्करण के लिए एक एकल हाइफ़न (उदा। -h) के लिए डबल हाइफ़न का उपयोग करता है। आप छोटे संस्करणों को एक साथ "ढेर" भी कर सकते हैं (उदा।, tar -zxvffilename) और अपने दिल की सामग्री के लिए लंबा और छोटा मिलान करें।

जीएनयू साइट में standard option names भी सूचीबद्ध है।

getopt library इन आदेशों को पार्सिंग को बहुत सरल बनाता है। यदि सी आपका बैग नहीं है, तो Python में एक समान लाइब्रेरी है, जैसा कि Perl है।

+2

विंडोज के लिए, वास्तव में मानक पैरामीटर रहित स्विच के लिए '/ foo' (लेकिन '-foo', बीएसडी-स्टाइल) का समर्थन करता है, और'/foo: value' (फिर से, वैकल्पिक' -फू: falue' के साथ) का उपयोग कर रहा है। पैरामीटर वाले लोगों के लिए। दूसरे शब्दों में, सिंटैक्स सभी माइक्रोसॉफ्ट कमांड लाइन टूल्स (बॉक्स के बाहर Win32, विकास उपकरण, आदि) द्वारा उपयोग किया जाता है। –

+0

पायथन में, optparse का उपयोग करें - http://docs.python.org/library/optparse.html - यह * getpt – dbr

+1

@dbr की तुलना में उपयोग करने के लिए बहुत अच्छा है, ऑप्टरसे को अब हटा दिया गया है, http: // के पक्ष में docs.python.org/library/argparse.html –

0

-operation [मापदंडों] -command [अपने आदेश] -anotherthings [otherparams] ....

उदाहरण के लिए,

YourApp.exe -file %YourProject.prj% -Secure true 
12

आप सी # का उपयोग कर रहे हैं, तो Mono.GetOptions कोशिश है, यह एक बहुत शक्तिशाली है और उपयोग में आसान कमांड लाइन तर्क पार्सर। यह मोनो वातावरण और माइक्रोसॉफ्ट .NET Framework के साथ काम करता है।

संपादित करें: यहाँ कुछ सुविधाओं

  • प्रत्येक परम 2 CLI अभ्यावेदन (1 चरित्र और स्ट्रिंग, जैसे -एक या --add)
  • डिफ़ॉल्ट मान
  • जोरदार टाइप किया
  • है कर रहे हैं स्वचालित रूप से निर्देशों के साथ एक सहायता स्क्रीन उत्पन्न करता है
  • स्वचालित रूप से एक संस्करण और कॉपीराइट स्क्रीन
+3

ऐसा लगता है कि मोनो अपने आप को रोक रहा है और NDesk.Options का जिक्र कर रहा है: http://ndesk.org/Options – quip

0

यदि आप कमांड लाइन इंटरफेस उत्पन्न करने के लिए मानक टूल में से एक का उपयोग करते हैं, जैसे गेटोपेट्स, तो आप स्वचालित रूप से अनुरूप होंगे।

3

करने के लिए सबसे अच्छी बात यह है कि यदि आप कर सकते हैं तो कुछ भी नहीं मानते हैं। जब ऑपरेटर निष्पादन के लिए आपके एप्लिकेशन नाम में टाइप करता है और उसके पास कोई पैरामीटर नहीं होता है या तो उन्हें यूएसएजी ब्लॉक के साथ मारा जाता है या वैकल्पिक रूप से एक विंडोज फॉर्म खोलता है और उन्हें आपकी आवश्यक चीज़ों को दर्ज करने की अनुमति देता है।

c:\>FOO 

FOO 

USAGE FOO -{Option}{Value} 

-A Do A stuff 
-B Do B stuff 

c:\> 

पैरामीटर परिसीमन मैं एक धार्मिक विषय के शीर्षक के अंतर्गत जगह: हाइफ़न (डैश), डबल हाइफ़न, स्लैश, कुछ भी नहीं है, स्थितीय, आदि

आप अपने मंच से संकेत मिलता है नहीं था, लेकिन के लिए अगली टिप्पणी मैं विंडोज और .net

आप .NET में कंसोल आधारित एप्लिकेशन बना सकते हैं और इसे कंसोल आधारित प्रोजेक्ट चुनकर बस डेस्कटॉप का उपयोग करके डेस्कटॉप से ​​बातचीत करने की अनुमति दे सकते हैं, फिर Windows.Forms, System.Drawing , आदि डीएलएल।

हम यह हर समय करते हैं। यह आश्वस्त करता है कि कोई भी अंधेरे गली को बंद नहीं करता है।

2

मैं हमेशा एक/जोड़ता हूं? सहायता प्राप्त करने के लिए पैरामीटर और मैं हमेशा एक डिफ़ॉल्ट (यानी सबसे आम परिदृश्य) कार्यान्वयन करने का प्रयास करता हूं।

अन्यथा मैं स्विच के लिए "/ x" और स्विच के लिए "/ x: value" का उपयोग करता हूं जिसके लिए मूल्यों को पारित करने की आवश्यकता होती है। नियमित अभिव्यक्तियों का उपयोग करके पैरामीटर को पार्स करना बहुत आसान बनाता है।

0

सम्मेलनों है कि आप आवेदन के लिए उपयोग

1 पर निर्भर करेगा) यह है आवेदन किस प्रकार।
2) आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं। लिनक्स? विंडोज? दोनों के पास अलग-अलग सम्मेलन हैं।

मैं जो सुझाव दूंगा वह आपके सिस्टम पर अन्य आदेशों के लिए अन्य कमांड लाइन इंटरफेस को देखता है, जो पैरामीटर पर विशेष ध्यान देते हैं। गलत पैरामीटर होने से उपयोगकर्ता समाधान निर्देशित त्रुटि संदेश देना चाहिए। सहायता स्क्रीन खोजने में आसान एक उपयोगिता में भी सहायता कर सकता है।

बिना पता के कि आपका एप्लिकेशन वास्तव में क्या करेगा, विशिष्ट उदाहरण देना मुश्किल है।

+0

यह क्यों मायने रखता है कि मैं लिनक्स बनाम विंडोज के लिए लिख रहा हूं या नहीं? मुझे लगता है कि एक मानक प्रारूप होना चाहिए जो दोनों के बीच सार्वभौमिक है। यदि आप इस पर अधिक अंतर्दृष्टि रखते हैं और साझा करने के इच्छुक हैं, तो मुझे बताएं। – lillq

+0

यह महत्वपूर्ण है क्योंकि दो ऑपरेटिंग सिस्टम चीजें अलग-अलग करते हैं। कमांड लाइन अनुप्रयोगों के पैरामीटर के उदाहरण में, लिनक्स उपयोग करता है - और विंडोज़ स्विच/स्विच निर्दिष्ट करने के लिए उपयोग करता है। यूनिक्स में ls -l, खिड़कियों के लिए dir/ah। एक अंतर चुनने के लिए। –

+0

@lillq शायद दोनों के बीच एक साझा प्रारूप होना चाहिए लेकिन ऐसा नहीं है। – jwg

4

कुछ चीज मुझे कुछ सीएलआई के बारे में पसंद है शॉर्टकट का उपयोग है।
यानी, सभी निम्नलिखित लाइनों एक ही बात

myCli.exe describe someThing 
myCli.exe descr someThing 
myCli.exe desc someThing 

इस तरह कर रहे हैं, उपयोगकर्ता टाइप करने के लिए सभी हर बार आदेश नहीं हो सकता है।

+0

यह विधि विशेष रूप से डार्क्स, गिट और सबवर्जन जैसे उपकरणों के साथ उपयोगी है, जहां अनिवार्य रूप से संबंधित लेकिन विशिष्ट आदेशों का एक सूट है। –

+0

बिल्कुल! सिवाय इसके कि मैं उस संस्करण का उपयोग किसी अन्य संस्करण नियंत्रण सीएलआई के लिए करता हूं: ClearCase के cleartool (ct);)। चूंकि मैं सबवर्जन रिपॉजिटरीज का प्रबंधन भी करता हूं, इसलिए मैं svn और svnadmin कमांड का अपना उचित हिस्सा करता हूं ... – VonC

3

यहाँ एक CodeProject लेख है कि आप मदद कर सकता है ...

C#/.NET Command Line Arguments Parser

यदि वीबी, अपने स्वाद है यहाँ एक अलग लेख (थोड़ा अधिक मार्गदर्शन संबंधित सामग्री के साथ) की जाँच करने के लिए है ...

Parse and Validate Command Line Parameters with VB.NET

+0

मैंने इसे देखा है। यह बहुत आसान लगता है। – Gqqnbig

+0

'इंस्टॉल-पैकेज कमांडलाइन पार्सर', सरल और आसान :) – hdoghmen

0

सम्मेलनों है कि आप आवेदन के लिए उपयोग

पर निर्भर करेगा

1) यह किस प्रकार का एप्लिकेशन है। 2) आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं।

यह निश्चित रूप से सच है। मैं डॉस-शीघ्र सम्मेलनों के बारे में कुछ नहीं कर रहा हूँ, लेकिन यूनिक्स सिस्टम पर सामान्य सम्मेलनों मोटे तौर पर कर रहे हैं:

1) प्रारूपण

appName मापदंडों

2 है) इस तरह के 'एक्स') -x 3) (जैसे 'एड-कुंजी') के रूप में मल्टी चरित्र पैरामीटर के रूप में पारित कर रहे हैं के रूप में पारित कर रहे हैं --add-कुंजी के रूप में एकल चरित्र मानकों (

3

कमांड लाइन सम्मेलन ओएस से ओएस में भिन्न होते हैं, लेकिन सम्मेलन जो शायद सबसे अधिक उपयोग प्राप्त कर लिया गया है, और सबसे सार्वजनिक जांच जीएनयू गेटोपेट पैकेज द्वारा समर्थित है। अधिक जानकारी के लिए http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html देखें।

इसकी सहायता से आप -nr के रूप में एक पत्र आदेश, मिश्रण, इस तरह के --numeric --reverse के रूप में लंबे समय तक, स्वयं का दस्तावेजीकरण विकल्प, के साथ की अनुमति देता है। अच्छा रहें, और एक --help (-?) विकल्प लागू करें और फिर आपके उपयोगकर्ता उन सभी को समझने में सक्षम होंगे जिन्हें उन्हें जानने की आवश्यकता है।

3

@ vonc के उत्तर को पूरक, अस्पष्ट संक्षेपों को स्वीकार न करें। उदाहरण:

myCli.exe describe someThing 
    myCli.exe destroy someThing 
    myCli.exe des someThing ??? 

वास्तव में, उस स्थिति में, शायद मैं "नष्ट" के लिए संक्षेप स्वीकार नहीं करता ...

+2

अच्छा बिंदु, असंबद्धता ध्यान में रखना एक और मानदंड है ... आपको +1, सर। – VonC

0

यदि आप पर्ल का उपयोग कर रहे हैं, तो मेरा CLI::Application ढांचा केवल वही हो सकता है जो आपको चाहिए। यह आपको एसवीएन/सीवीएस/जीआईटी के साथ आसानी से यूजर इंटरफेस जैसे अनुप्रयोगों को बनाने देता है ("आपके-कमांड-ओ-लोंग-कुछ कुछ क्रियाओं को निष्पादित करने के लिए कुछ क्रियाएं")।

0

मैंने एक .Net C# लाइब्रेरी बनाई है जिसमें कमांड लाइन पार्सर शामिल है। आपको केवल उस वर्ग को बनाने की आवश्यकता है जो CmdLineObject क्लास से विरासत में है, प्रारंभ करें, और यह स्वचालित रूप से गुणों को पॉप्युलेट करेगा। यह विभिन्न प्रकारों में रूपांतरणों को संभाल सकता है (प्रोजेक्ट में भी शामिल एक उन्नत रूपांतरण लाइब्रेरी का उपयोग करता है), सरणी, कमांड लाइन उपनाम, क्लिक-एक बार तर्क, इत्यादि। यह स्वचालित रूप से कमांड लाइन सहायता (/?) बनाता है।

यदि आप रुचि रखते हैं, तो परियोजना का यूआरएल http://bizark.codeplex.com है। यह वर्तमान में केवल स्रोत कोड के रूप में उपलब्ध है।

+0

की तुलना में छोटे विकल्पों को समूहबद्ध करने के अभ्यास का वर्णन करने के लिए अधिक आम है https://commandline.codeplex.com/ के बारे में क्या? – Kiquenet

4

एक अच्छा और उपयोगी संदर्भ: NuGet के माध्यम से

https://commandline.codeplex.com/

लाइब्रेरी उपलब्ध:

  1. नवीनतम स्थिर: Install-Package CommandLineParser
  2. नवीनतम रिलीज: Install-Package CommandLineParser -pre

डिफ़ॉल्ट सिंगलटन का उपयोग करके एक पंक्ति पार्सिंग: CommandLine.Parser.Default.ParseArguments(...)
एक लाइन सहायता स्क्रीन जनरेटर: HelpText.AutoBuild(...)
मानचित्र कमांड लाइन तर्क IList<string>, सरणी, enum या मानक स्केलर प्रकार के लिए तर्क।
प्लग-इन अनुकूल वास्तुकला जैसा यहां बताया गया है।
क्रिया आदेशों को git commit -a के रूप में परिभाषित करें।
लैम्ब्डा अभिव्यक्तियों का उपयोग करके पार्सर उदाहरण बनाएं।

त्वरित प्रारंभ: https://commandline.codeplex.com/wikipage?title=Quickstart&referringTitle=Documentation

// Define a class to receive parsed values 
class Options { 
    [Option('r', "read", Required = true, 
    HelpText = "Input file to be processed.")] 
    public string InputFile { get; set; } 

    [Option('v', "verbose", DefaultValue = true, 
    HelpText = "Prints all messages to standard output.")] 
    public bool Verbose { get; set; } 

    [ParserState] 
    public IParserState LastParserState { get; set; } 

    [HelpOption] 
    public string GetUsage() { 
    return HelpText.AutoBuild(this, 
     (HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current)); 
    } 
} 

// Consume them 
static void Main(string[] args) { 
    var options = new Options(); 
    if (CommandLine.Parser.Default.ParseArguments(args, options)) { 
    // Values are available here 
    if (options.Verbose) Console.WriteLine("Filename: {0}", options.InputFile); 
    } 
} 
+0

यह कमांड लाइन पार्सर में एक [नया घर] है (https://github.com/commandlineparser/commandline)। –

0

मैं इस ढांचे का विकास किया है, शायद यह मदद करता है:

SysCommand एक शक्तिशाली पार मंच रूपरेखा है, .NET में कंसोल अनुप्रयोगों को विकसित करने के। सरल, प्रकार-सुरक्षित, और एमवीसी पैटर्न के महान प्रभाव के साथ है।

https://github.com/juniorgasparotto/SysCommand

namespace Example.Initialization.Simple 
{ 
    using SysCommand.ConsoleApp; 

    public class Program 
    { 
     public static int Main(string[] args) 
     { 
      return App.RunApplication(); 
     } 
    } 

    // Classes inheriting from `Command` will be automatically found by the system 
    // and its public properties and methods will be available for use. 
    public class MyCommand : Command 
    { 
     public void Main(string arg1, int? arg2 = null) 
     { 
      if (arg1 != null) 
       this.App.Console.Write(string.Format("Main arg1='{0}'", arg1)); 
      if (arg2 != null) 
       this.App.Console.Write(string.Format("Main arg2='{0}'", arg2)); 
     } 

     public void MyAction(bool a) 
     { 
      this.App.Console.Write(string.Format("MyAction a='{0}'", a)); 
     } 
    } 
} 

टेस्ट:

// auto-generate help 
$ my-app.exe help 

// method "Main" typed 
$ my-app.exe --arg1 value --arg2 1000 

// or without "--arg2" 
$ my-app.exe --arg1 value 

// actions support 
$ my-app.exe my-action -a 
0

मैं सिर्फ एक और भी बेहतर कमांड लाइन पार्सर जारी किया है।
https://github.com/gene-l-thomas/coptions
यह nuget पर है स्थापित करें-पैकेज coptions

using System; 
using System.Collections.Generic; 
using coptions; 

[ApplicationInfo(Help = "This program does something useful.")] 
public class Options 
{ 
    [Flag('s', "silent", Help = "Produce no output.")] 
    public bool Silent; 

    [Option('n', "name", "NAME", Help = "Name of user.")] 
    public string Name 
    { 
     get { return _name; } 
     set { if (String.IsNullOrWhiteSpace(value)) 
       throw new InvalidOptionValueException("Name must not be blank"); 
       _name = value; 
     } 
    } 
    private string _name; 

    [Option("size", Help = "Size to output.")] 
    public int Size = 3; 

    [Option('i', "ignore", "FILENAME", Help = "Files to ignore.")] 
    public List<string> Ignore; 

    [Flag('v', "verbose", Help = "Increase the amount of output.")] 
    public int Verbose = 1; 

    [Value("OUT", Help = "Output file.")] 
    public string OutputFile; 

    [Value("INPUT", Help = "Input files.")] 
    public List<string> InputFiles; 
} 

namespace coptions.ReadmeExample 
{ 
    class Program 
    { 
     static int Main(string[] args) 
     { 
      try 
      { 
       Options opt = CliParser.Parse<Options>(args); 

       Console.WriteLine(opt.Silent); 
       Console.WriteLine(opt.OutputFile); 
       return 0; 
      } 
      catch (CliParserExit) 
      { 
       // --help 
       return 0; 

      } catch (Exception e) 
      { 
       // unknown options etc... 
       Console.Error.WriteLine("Fatal Error: " + e.Message); 
       return 1; 
      } 
     } 
    } 
} 

स्वचालित --help पीढ़ी, क्रिया, उदा का समर्थन करता है commmand.exe
आनंद लें।

+0

आपका लिंक टूटा हुआ है। तो कोई दस्तावेज नहीं है। बीटीडब्ल्यू, आपका lib [gsscoder कमांड लाइन पार्सर] का एक क्लोन प्रतीत होता है (https://github.com/gsscoder/commandline) ... –

+1

मैंने देखा [कमांड लाइन] (https://github.com/commandlineparser/कमांडलाइन) और [क्लिपआर] (https://github.com/nemec/clipr) इससे पहले कि मैंने एनोटेशन का उपयोग दोनों के रूप में कोडिंग को देखा। मैंने बड़े पैमाने पर क्लिपर बढ़ाया है जिसका कोड बेहतर गुणवत्ता वाला था, और एपीआई साफ था, लेकिन समझदार नाम [विकल्प] और [वैल्यू] का उपयोग करके समाप्त हुआ, [ध्वज] जो उपयोगकर्ता के लिए अलग है (कोई मूल्य नहीं)। अब मैंने पॉपुलटिंग फ़ील्ड (कम टाइपिंग),/विंडोज़ और -1111 शैली विकल्पों के लिए समर्थन जोड़ा है। और पार्सिंग .ini फाइलें। लिंक https://github.com/GeneThomas/coptions होगा। – user3373555