C#命令行参数解析类以及使用实例

转载 2013年12月03日 18:03:27

编写命令行程序时如何进行命令行参数解析至关重要,下面将引用codeproject里面的一个命令行参数解析类并阐述如何使用来说明C#命令行参数解析的过程。

先看参数解析类,分为CommandLine类以及CommandArgs类,前者负责解析,后者负责结果封装,解析的结果分为三类:即 a=b 对应的key/value类型,-a b 对应的option与option value(可省略,值即转为true),以及单独的aaa所对应的param类型。

//---------------------------------------------------------------------

/// <summary>

/// Contains the parsed command line arguments. This consists of two

/// lists, one of argument pairs, and one of stand-alone arguments.

/// </summary>

public class CommandArgs

{

//---------------------------------------------------------------------

/// <summary>

/// Returns the dictionary of argument/value pairs.

/// </summary>

public Dictionary<stringstring> ArgPairs

{

get { return mArgPairs; }

}

Dictionary<stringstring> mArgPairs = new Dictionary<stringstring>();

//---------------------------------------------------------------------

/// <summary>

/// Returns the list of stand-alone parameters.

/// </summary>

public List<string> Params

{

get { return mParams; }

}

List<string> mParams = new List<string>();

}

//---------------------------------------------------------------------

/// <summary>

/// Implements command line parsing

/// </summary>

public class CommandLine

{

//---------------------------------------------------------------------

/// <summary>

/// Parses the passed command line arguments and returns the result

/// in a CommandArgs object.

/// </summary>

/// The command line is assumed to be in the format:

///

/// CMD [param] [[-|--|\]&lt;arg&gt;[[=]&lt;value&gt;]] [param]

///

/// Basically, stand-alone parameters can appear anywhere on the command line.

/// Arguments are defined as key/value pairs. The argument key must begin

/// with a '-', '--', or '\'. Between the argument and the value must be at

/// least one space or a single '='. Extra spaces are ignored. Arguments MAY

/// be followed by a value or, if no value supplied, the string 'true' is used.

/// You must enclose argument values in quotes if they contain a space, otherwise

/// they will not parse correctly.

///

/// Example command lines are:

///

/// cmd first -o outfile.txt --compile second \errors=errors.txt third fourth --test = "the value" fifth

///

/// <param name="args">array of command line arguments</param>

/// <returns>CommandArgs object containing the parsed command line</returns>

public static CommandArgs Parse(string[] args)

{

char[] kEqual = new char[] { '=' };

char[] kArgStart = new char[] { '-''\\' };

CommandArgs ca = new CommandArgs();

int ii = -1;

string token = NextToken(args, ref ii);

while (token != null)

{

if (IsArg(token))

{

string arg = token.TrimStart(kArgStart).TrimEnd(kEqual);

string value = null;

if (arg.Contains("="))

{

// arg was specified with an '=' sign, so we need

// to split the string into the arg and value, but only

// if there is no space between the '=' and the arg and value.

string[] r = arg.Split(kEqual, 2);

if (r.Length == 2 && r[1] != string.Empty)

{

arg = r[0];

value = r[1];

}

}

while (value == null)

{

string next = NextToken(args, ref ii);

if (next != null)

{

if (IsArg(next))

{

// push the token back onto the stack so

// it gets picked up on next pass as an Arg

ii--;

value = "true";

}

else if (next != "=")

{

// save the value (trimming any '=' from the start)

value = next.TrimStart(kEqual);

}

}

}

// save the pair

ca.ArgPairs.Add(arg, value);

}

else if (token != string.Empty)

{

// this is a stand-alone parameter.

ca.Params.Add(token);

}

token = NextToken(args, ref ii);

}

return ca;

}

//---------------------------------------------------------------------

/// <summary>

/// Returns True if the passed string is an argument (starts with

/// '-', '--', or '\'.)

/// </summary>

/// <param name="arg">the string token to test</param>

/// <returns>true if the passed string is an argument, else false if a parameter</returns>

static bool IsArg(string arg)

{

return (arg.StartsWith("-") || arg.StartsWith("\\"));

}

//---------------------------------------------------------------------

/// <summary>

/// Returns the next string token in the argument list

/// </summary>

/// <param name="args">list of string tokens</param>

/// <param name="ii">index of the current token in the array</param>

/// <returns>the next string token, or null if no more tokens in array</returns>

static string NextToken(string[] args, ref int ii)

{

ii++; // move to next token

while (ii < args.Length)

{

string cur = args[ii].Trim();

if (cur != string.Empty)

{

// found valid token

return cur;

}

ii++;

}

// failed to get another token

return null;

}

}

---------------------------------------------------------------------------------------------------------------------------------------------

下面使用一个命令行程序来说明如何调用上述解析类,对具体的命令行解析,如下是调用代码。

static void Main(string[] args)

{

CommandArgs commandArg = CommandLine.Parse(args);

List<string> lparams = commandArg.Params;

for (int i = 0; i < lparams.Count; i++)

{

string commandArgString = commandArg.Params[i];

System.Console.WriteLine(commandArgString);

}

Dictionary<stringstring> argPairs = commandArg.ArgPairs;

List<string> keys = argPairs.Keys.ToList();

for (int i = 0; i < keys.Count; i++)

{

string strKey = keys[i];

string strValue = argPairs[strKey];

System.Console.WriteLine("Key/Value: " + strKey + "/" + strValue);

}

}

----------------------------------------------------------------------------------------------------------------------------------------------------

测试时输入命令行参数“ -cc -dd ee ff -this a -that b ccc=fff bbb=rrrr ”,最后的解析结果请大家自己查看一下。

相关文章推荐

C# 接受命令行参数

class TestClass {     static void Main(string[] args)     {         // Display the number of com...
  • lhzjj
  • lhzjj
  • 2012年12月12日 16:23
  • 8190

C#命令行参数解析类以及使用实例

编写命令行程序时如何进行命令行参数解析至关重要,下面将引用codeproject里面的一个命令行参数解析类并阐述如何使用来说明C#命令行参数解析的过程。先看参数解析类,分为CommandLine类以及...

命令行参数解析函数getopt_long() 使用详解

当一个用C语言编写的Linux或UNIX程序运行时,它是从main函数开始的。对这些程序而言,main函数的声明如下所示:int main(int argc, char *argv[])其中argc是...
  • feglass
  • feglass
  • 2016年05月21日 09:13
  • 1035

MFC解析启动命令行参数——CCommandLineInfo类

MFC中CCommandLineInfo类被用于分析启动应用时的命令行参数。 MFC应用一般都会在它的应用对象中使用函数InitInstance创建这个类的一个本地实例。然后把该对象传给CWinApp...

深度学习框架Caffe学习笔记(5)-使用gflags解析命令行参数

在Caffe源码中,命令行参数的解析都是用gflags的库。在安装Caffe依赖包的时候就有libgflags-dev这个包。gflags是google开发的开源命令行解析库,使用C++开发,用起来比...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#命令行参数解析类以及使用实例
举报原因:
原因补充:

(最多只允许输入30个字)