代码之家  ›  专栏  ›  技术社区  ›  Shaihi

C#紧凑的框架友好的命令行解析器

  •  1
  • Shaihi  · 技术社区  · 14 年前

    我读到这个问题: Command Line Parser for .NET .

    我以为这就是我要找的,但是图书馆 Command Line Parser Library 不是紧凑的框架友好的。。。

    真正地

    有人知道适合紧凑框架的库吗(最好具有上述简单性和功能性)

    3 回复  |  直到 7 年前
        1
  •  1
  •   Bryan    14 年前

    using System.Collections.Specialized;
    using System.Text.RegularExpressions;
    
    /// <summary>
    /// Parses the command line arguments into a name/value collection
    /// </summary>
    public class CommandLineArgumentParser
    {
        #region Fields
        private StringDictionary parameters;
        #endregion
    
        #region Constructors
        /// <summary>
        ///     Initializes a new instance of the <see cref="CommandLineArgumentParser"/> class.
        /// </summary>
        /// <param name="args">command-line arguments
        /// </param>
        public CommandLineArgumentParser(string[] args)
        {
            this.parameters = new StringDictionary();
            Regex spliter = new Regex(@"^-{1,2}|^/|=|:", RegexOptions.IgnoreCase | RegexOptions.Compiled);
    
            Regex remover = new Regex(@"^['""]?(.*?)['""]?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
    
            string parameter = null;
            string[] parts;
    
            // Valid parameters forms:
            // {-,/,--}param{ ,=,:}((",')value(",'))
            // Examples: 
            // -param1 value1 --param2 /param3:"Test-:-work" 
            //   /param4=happy -param5 '--=nice=--'
            foreach (string txt in args)
            {
                // Look for new parameters (-,/ or --) and a
                // possible enclosed value (=,:)
                parts = spliter.Split(txt, 3);
    
                switch (parts.Length)
                {
                    // Found a value (for the last parameter 
                    // found (space separator))
                    case 1:
                        if (parameter != null)
                        {
                            if (!this.parameters.ContainsKey(parameter))
                            {
                                parts[0] = remover.Replace(parts[0], "$1");
    
                                this.parameters.Add(parameter, parts[0]);
                            }
    
                            parameter = null;
                        }
    
                        // else Error: no parameter waiting for a value (skipped)
                        break;
    
                    // Found just a parameter
                    case 2:
                        // The last parameter is still waiting. 
                        // With no value, set it to true.
                        if (parameter != null)
                        {
                            if (!this.parameters.ContainsKey(parameter))
                            {
                                this.parameters.Add(parameter, "true");
                            }
                        }
    
                        parameter = parts[1];
                        break;
    
                    // Parameter with enclosed value
                    case 3:
                        // The last parameter is still waiting. 
                        // With no value, set it to true.
                        if (parameter != null)
                        {
                            if (!this.parameters.ContainsKey(parameter))
                            {
                                this.parameters.Add(parameter, "true");
                            }
                        }
    
                        parameter = parts[1];
    
                        // Remove possible enclosing characters (",')
                        if (!this.parameters.ContainsKey(parameter))
                        {
                            parts[2] = remover.Replace(parts[2], "$1");
                            this.parameters.Add(parameter, parts[2]);
                        }
    
                        parameter = null;
                        break;
                }
            }
    
            // In case a parameter is still waiting
            if (parameter != null)
            {
                if (!this.parameters.ContainsKey(parameter))
                {
                    this.parameters.Add(parameter, "true");
                }
            }
        }
        #endregion
    
        #region Properties
        /// <summary>
        /// Gets a count of command line arguments
        /// </summary>
        public int Count
        {
            get
            {
                return this.parameters.Count;
            }
        }
    
        /// <summary>
        /// Gets the value with the given parameter name
        /// </summary>
        /// <param name="param">name of the parameter</param>
        /// <returns>the value of the parameter</returns>
        public string this[string param]
        {
            get
            {
                return this.parameters[param];
            }
        }
        #endregion
    }
    
        2
  •  2
  •   Glauber Gasparotto    7 年前

    我开发了这个框架,也许它有助于:

    SysCommand是一个强大的跨平台框架,用于在.NET中开发控制台应用程序。它简单、类型安全,并且受MVC模式的影响很大。

    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
    
        3
  •  0
  •   No Refunds No Returns    14 年前

    http://commandline.codeplex.com/ 我已经用过很多次了,我都数不清了。也许它对CE有用。如果没有,它将提供一个极好的起点。