Вопрос

Я прочитал этот вопрос: Паризер командной строки для .net.

Я думал, что это то, что я искал, но библиотека Библиотека анализатора командной строки не является компактным фреймворком ...

я В САМОМ ДЕЛЕ Не хочу писать синтаксический анализатор CL, и я ушел от реальной цели моего маленького приложения из -за этого неудачного испытания.

Кто-то знает о библиотеке, которая соответствует компактной каркасной работе? (предпочтительно с простотой и функциональностью, подобной упомянутой выше)
Не имеет значения, версия 2 или 3.5

Это было полезно?

Решение

Это то, что я использую. Я позаимствовал это откуда -то, но не уверен, где:

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
}

Другие советы

Я разработал эту структуру, может быть, это помогает:

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

http://commandline.codeplex.com/ Я использовал это много раз, я потерял счет. Может быть, это работает для CE. Если нет, это обеспечит фантастическую отправную точку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top