博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#程序处理命令行参数
阅读量:6829 次
发布时间:2019-06-26

本文共 6072 字,大约阅读时间需要 20 分钟。

hot3.png

C#程序通过主函数的args参数接收命令行参数:static void Main(string[] args)

如果一个程序接收到的命令行参数非常多,那手工读取命令行参数无疑是件痛苦的事情。

为此我找到了一篇codeproject上的博客,里面介绍了一个C#程序命令行参数的转换工具类。

using System;using System.Collections.Specialized;using System.Text.RegularExpressions;namespace CommandLine.Utility{    ///     /// Arguments class    ///     public class Arguments{        // Variables        private StringDictionary Parameters;        // Constructor        public Arguments(string[] Args)        {            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(!Parameters.ContainsKey(Parameter))                         {                            Parts[0] =                                 Remover.Replace(Parts[0], "$1");                            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(!Parameters.ContainsKey(Parameter))                             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(!Parameters.ContainsKey(Parameter))                             Parameters.Add(Parameter, "true");                    }                    Parameter = Parts[1];                    // Remove possible enclosing characters (",')                    if(!Parameters.ContainsKey(Parameter))                    {                        Parts[2] = Remover.Replace(Parts[2], "$1");                        Parameters.Add(Parameter, Parts[2]);                    }                    Parameter=null;                    break;                }            }            // In case a parameter is still waiting            if(Parameter != null)            {                if(!Parameters.ContainsKey(Parameter))                     Parameters.Add(Parameter, "true");            }        }        // Retrieve a parameter value if it exists         // (overriding C# indexer property)        public string this [string Param]        {            get            {                return(Parameters[Param]);            }        }    }}

(PS:实际使用时命名空间和类名可根据自身项目实际情况修改)

为此我建立了一个工程,测试了这段代码。

测试参数如下:

-param0 -param1 value1 --param2 value2 /param3 value3 =param4 value4 :param5 value5 -param6=param6 -param7:param7 -param8.1 "1234" -param8.2 "1 2 3 4" -param9.1 '1234' -param9.2='1 2 3 4'

各参数项测试内容如下:

  1. -param0,只有参数项
  2. -param1 value1,有参数项,有参数值
  3. --param2 value2,用--标记参数项开头
  4. /param value3,用/标记参数项开头
  5. =param4 value4,用=标记参数项开头
  6. :param5 value5,用:标记参数项开头
  7. -param6=param6,用=标记参数项与参数值的关系
  8. -param7:param7,用:标记参数项与参数值的关系
  9. -param8.1 "1234",用""指定参数
  10. -param8.2 "1 2 3 4",用""指定参数(含空格)
  11. -param9.1 '1234',用''指定参数
  12. -param9.2='1 2 3 4',用''指定参数(含空格)

我的测试程序代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ArgumentTest{    class Program    {        static void Main(string[] args)        {            Arguments arguments = new Arguments(args);            WriteLinePara(arguments, "param0");            WriteLinePara(arguments, "param1");            WriteLinePara(arguments, "param2");            WriteLinePara(arguments, "param3");            WriteLinePara(arguments, "param4");            WriteLinePara(arguments, "param5");            WriteLinePara(arguments, "param6");            WriteLinePara(arguments, "param7");            WriteLinePara(arguments, "param8.1");            WriteLinePara(arguments, "param8.2");            WriteLinePara(arguments, "param9.1");            WriteLinePara(arguments, "param9.2");            WriteLinePara(arguments, "param_");            Console.ReadLine();        }        static void WriteLinePara(Arguments arguments, string key)        {            if (arguments[key] != null)            {                Console.WriteLine(key +  " value: " + arguments[key]);            }            else            {                Console.WriteLine(key + " not defined !");            }        }    }}

运行结果如下:

param0 value: trueparam1 value: value1param2 value: value2param3 value: value3param4 value: value4param5 value: value5param6 value: param6param7 value: param7param8.1 value: 1234param8.2 value: 1 2 3 4param9.1 value: 1234param9.2 value: 1param_ not defined !

对这段运行结果的说明如下:

1、判断命令行参数有无参数项,可用

if (arguments[key] != null){    Console.WriteLine(key +  " value: " + arguments[key]);}else{    Console.WriteLine(key + " not defined !");}

2、param0只有参数项无参数值,我们的代码会将其默认为true

3、param9.2接收到的参数是单引号包围的含空格的字符串,但它无法正确解析,原因是 -param9.2='1 2 3 4' 被当做了四个传入参数,即 -param9.2='1、2、3、4'

END

转载于:https://my.oschina.net/Tsybius2014/blog/733921

你可能感兴趣的文章
Swift 4.1带来条件一致性等语言上的提升
查看>>
Apache Pulsar中的地域复制,第2篇:模式和实践
查看>>
百度开源AI硬件开发平台BIE-AI-Box和BIE-AI-Board
查看>>
管理微服务中的数据
查看>>
百度发布开源智能边缘计算平台OpenEdge
查看>>
如何用Uber JVM Profiler等可视化工具监控Spark应用程序?
查看>>
京东618:六年历程步步为营,京东商城的安全保卫战
查看>>
华泰证券:如何自研高效可靠的交易系统通信框架?
查看>>
网易云基于Prometheus的微服务监控实践
查看>>
深入剖析通信层和RPC调用的异步化(下)
查看>>
英特尔发布CPU新架构,突破性采用3D堆栈法
查看>>
CNCF接纳Harbor为沙箱项目
查看>>
三问百度云,ABC如何帮它跑赢马拉松?
查看>>
使用人工智能测试软件
查看>>
短视频时代,LinkedIn如何利用数据提高视频性能
查看>>
《Storm Applied》书评与作者访谈
查看>>
用深度学习解决冯-诺依曼结构内存性能瓶颈
查看>>
2016 “Better Software East/DevOps East/Agile Dev East”三个会议上的发言
查看>>
五大理由告诉你,再不看Kubernetes真的晚了
查看>>
编译安装php&&apahce以及pecl使用
查看>>