前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#命令行解析工具

C#命令行解析工具

作者头像
林德熙
发布2018-09-19 12:26:51
1.2K0
发布2018-09-19 12:26:51
举报
文章被收录于专栏:林德熙的博客林德熙的博客

我将告诉大家两个方法去获取C#输入的命令行参数。

第一个方法是不需要安装任何的库,这个方法是性能很高,但是封装不好。第二个方法是使用 CommandLineParser 库,这个库提高很好的封装但是性能会比较差。

第一个方法:

林选臣大神写的,他的方法很简单。

首先复制两个类到项目

      public class CommandLineArgumentParser
    {
        private readonly List<CommandLineArgument> _arguments;

        public CommandLineArgumentParser(string[] args)
        {
            _arguments = new List<CommandLineArgument>();

            for (var i = 0; i < args.Length; i++)
            {
                _arguments.Add(new CommandLineArgument(_arguments, i, args[i]));
            }
        }

        public static CommandLineArgumentParser Parse(string[] args)
        {
            return new CommandLineArgumentParser(args);
        }

        public CommandLineArgument Get(string argumentName)
        {
            return _arguments.FirstOrDefault(p => p == argumentName);
        }

        public IEnumerable<CommandLineArgument> GetEnumerator()
        {
            foreach (var temp in _arguments)
            {
                yield return temp;
            }
        }

        public bool Has(string argumentName)
        {
            return _arguments.Count(p => p == argumentName) > 0;
        }
    }

    public class CommandLineArgument
    {
        private readonly List<CommandLineArgument> _arguments;

        private readonly string _argumentText;

        private readonly int _index;

        internal CommandLineArgument(List<CommandLineArgument> args, int index, string argument)
        {
            _arguments = args;
            _index = index;
            _argumentText = argument;
        }

        public CommandLineArgument Next
        {
            get
            {
                if (_index < _arguments.Count - 1)
                {
                    return _arguments[_index + 1];
                }

                return null;
            }
        }

        public CommandLineArgument Previous
        {
            get
            {
                if (_index > 0)
                {
                    return _arguments[_index - 1];
                }

                return null;
            }
        }

        public CommandLineArgument Take()
        {
            return Next;
        }

        public IEnumerable<CommandLineArgument> Take(int count)
        {
            var list = new List<CommandLineArgument>();
            var parent = this;
            for (var i = 0; i < count; i++)
            {
                var next = parent.Next;
                if (next == null)
                    break;

                list.Add(next);

                parent = next;
            }

            return list;
        }

        public static implicit operator string(CommandLineArgument argument)
        {
            return argument?._argumentText;
        }

        public override string ToString()
        {
            return _argumentText;
        }
    }

复制完成就可以使用,在主函数可以使用下面代码进行转换,下面代码的 args 就是传入的参数字符串数组。

    var arguments = CommandLineArgumentParser.Parse(args);

如果需要获得参数的信息,可以使用下面代码,也就是使用 Get 方法传入一个指定的值,通过这个值就可以拿到这个值的参数

var f = arguments.Get("--lindexi").Take();

如命令输入--lindexi doubi,上面代码就可以拿到doubi,虽然使用这个库的写法的封装不是很好,但是性能很好。下面告诉大家使用另一个方法,十分容易写,但是性能比较差。

第二个方法需要使用 Nuget 安装 CommandLineParser 库,可以在控制台输入下面代码安装

  Install-Package CommandLineParser

然后写一个工具类,代码是在申龙斌大神博客 抄的

   class Options
   {

        // 短参数名称,长参数名称,是否是可选参数,默认值,帮助文本等

        // 第一个参数-d 如果使用比较高的 .net 那么第一个参数可能是 char 而不是字符串

        [Option("d", "dir", Required = true, HelpText = "PGN Directory to read.")]
        public string PgnDir { get; set; }

        // 新的版本使用的是 char 来作为第一个字符,也就是需要修改 "d" 为 'd' 字符
        // [Option('d', "dir", Required = true, HelpText = "PGN Directory to read.")]
        // public string PgnDir { get; set; }

        // 第二个参数-s 也可以使用 --step 

        [Option("s", "step", DefaultValue = 30, HelpText = "The maximum steps in PGN game to process.")]
        public int MaxStep { get; set; }

        [HelpOption]
        public string GetUsage()
        {

            // 应该可以根据前面的参数设置自动生成使用说明的,这里没有使用

            var usage = new StringBuilder();

            usage.AppendLine("OpeningBook 1.0");

            usage.AppendLine("-d PgnDir [-s MaxSteps=30]");

            return usage.ToString();
        }
}

主程序Main里使用可以使用下面代码,这里的 args 数组就是主函数传入函数。下面的代码是老版本的写法

// 老版本的写法

var options = new Options();

if (Parser.Default.ParseArguments(args, options))
{

     string pgnDir = options.PgnDir;

     int maxStep = options.MaxStep;

     // 参数取出来了,可以随便使用了

     // 本例中参数比较简单,稍微有点大材小用了

}
else  
{
//转化失败

      Console.WriteLine(options.GetUsage());

}

上面的代码是老的版本,现在更新 2.2.0 版本是需要修改代码

    class Options
    {
        // 注意 'd' 用的是字符
        // 短参数名称,长参数名称,是否是可选参数,默认值,帮助文本等

        [Option('d', "dir", Required = true, HelpText = "PGN Directory to read.")]
        public string PgnDir { get; set; }

        // 第二个参数-s

        [Option('s', "step", HelpText = "The maximum steps in PGN game to process.")]
        public int MaxStep { get; set; }
    }

原来的 DefaultValue 修改为 Default 可以传入任何类型

在 Main 函数需要修改代码

            CommandLine.Parser.Default.ParseArguments<Options>(args)
                .WithParsed(options =>
                {
                    var step = options.MaxStep;
                })
                .WithNotParsed(errorList =>
                {
                    
                });

在 WithParsed 就是解析成功的委托,在 WithNotParsed 就是解析失败的

如何使用参见:http://www.cnblogs.com/speeding/archive/2012/08/07/2626066.html

Quickstart · gsscoder/commandline Wiki

参见:http://www.cnblogs.com/linxuanchen/p/c-sharp-command-line-argument-parser.html

http://www.cnblogs.com/speeding/archive/2012/08/07/2626066.html

安利一款命令行参数


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档