文档章节

C#程序处理命令行参数

北风其凉
 北风其凉
发布于 2016/08/17 11:44
字数 835
阅读 42
收藏 2
点赞 0
评论 0

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

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

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

http://www.codeproject.com/Articles/3111/C-NET-Command-Line-Arguments-Parser

using System;
using System.Collections.Specialized;
using System.Text.RegularExpressions;

namespace CommandLine.Utility
{
    /// <summary>
    /// Arguments class
    /// </summary>
    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: true
param1 value: value1
param2 value: value2
param3 value: value3
param4 value: value4
param5 value: value5
param6 value: param6
param7 value: param7
param8.1 value: 1234
param8.2 value: 1 2 3 4
param9.1 value: 1234
param9.2 value: 1
param_ 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

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 493
码字总数 462457
作品 4
朝阳
程序员
C#简单的欢迎程序

本节课通过介绍几个简单的程序,使得你对C#有所入门。本节程要达到如下几个目的: 1.理解一个C#程序的基本结构。 2.初步了解"名称空间"的概念。 3.初步了解"类"的概念。 4.了解"Main"方法所做...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

C Sharp与.net学习笔记(一)

C#和.net都是零基础,需要一到两周先恶补一点东西,特此记录一下 2012.01.11 C#控制台程序 一个入门用的hello world程序如下: using System;class CSharpTest{ static void Main() { Consol...

晨曦之光 ⋅ 2012/05/08 ⋅ 0

[毕业生的商业软件开发之路]Main函数

近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些徘徊在职场门口的学生一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开...

技术小胖子 ⋅ 2017/10/31 ⋅ 0

在操作系统重启后恢复应用程序的工作状态

Windows 10 创意者更新之后,默认开启了重启后恢复应用程序状态的功能。这是自 Vista 以来就提供的功能——Restart Manager。 应用程序实现这一功能只需要调用 即可。传入两个参数: 重启后使...

WPwalter ⋅ 01/30 ⋅ 0

F#入门:使用 .NET Framework 中的函数式编程技术

作 为 Microsoft® .NET Framework 家族的新成员,F# 提供类型安全、性能以及类似脚本语言的工作能力,所有这些都是 .NET 环境的一部分。此函数式语言由 Microsoft 研究院的 Don Syme 发明,...

红薯 ⋅ 2010/04/20 ⋅ 2

Unity3D下用C#通过WinSCP命令行方式给Linux服务器SCP传文件

遇到一个需求是在Unity3D做编辑器工具时需要把生成的AssetBundle包上传到资源服务器,资源服务器用的Linux。 实现分为三部分:1,C#上传工具类;2,WinSCP脚本;3,传参调用使用上传功能。 ...

zl1030 ⋅ 2017/04/30 ⋅ 0

C# 搜索文字在文件、文件夹中的出现位置

〇、关于本文 在linux中查询文字在文件中出现的位置,或者在一个文件夹中出现的位置,用命令 就可以了。今天做了一个C#程序,专门用来找出一个指定字符串在文件中的位置,与一个指定字符串在...

北风其凉 ⋅ 2014/07/04 ⋅ 0

getopt 与 getoptlong

getopt 简介 getopt被用来解析命令行选项参数。 #include <unistd.h>extern char *optarg; //选项的参数指针extern int optind, //下一次调用getopt的时,从optind存储的位置处重新开始检查选...

面码 ⋅ 2014/04/29 ⋅ 0

Linux程序设计——用getopt处理命令行参数

原来命令行参数处理可以这么写-getopt? 经常要写点Linux下命令行的测试程序,都需要对命令行参数做一些处理,以前都是自己来写参数的处理,不只每次写的都不一样,而且每次还浪费时间去做参...

雅各宾 ⋅ 2013/09/03 ⋅ 0

ylbtech-LanguageSamples-Indexers(索引器)

1.A,示例(Sample)返回顶部 “索引器”示例 本示例演示 C# 类如何声明索引器以提供对类的类似数组的访问。 在 Visual Studio 中生成并运行“索引器”示例 从命令行生成并运行“索引器”示例 ...

吞吞吐吐的 ⋅ 2017/10/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 14分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 26分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 59分钟前 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部