CommandArgs / CommandLine 完整原始碼
using System;
using System.Collections.Generic;
using System.Text;
namespace WHC.EDNMS.Commons
{
public class CommandArgs
{
Dictionary<string, string> mArgPairs = new Dictionary<string, string>();
public Dictionary<string, string> ArgPairs { get { return mArgPairs; } }
public List<string> Params { get { return mParams; } }
List<string> mParams = new List<string>();
}
public class CommandLine
{
///
/// 支援格式: CMD [param] [[-|--|\]<arg>[[=]<value>]] [param]
/// 範例: cmd first -o outfile.txt --compile second \errors=errors.txt third fourth --test = "the value" fifth
///
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("="))
{
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))
{ ii--; value = "true"; }
else if (next != "=")
{ value = next.TrimStart(kEqual); }
}
}
ca.ArgPairs.Add(arg, value);
}
else if (token != string.Empty)
{
ca.Params.Add(token);
}
token = NextToken(args, ref ii);
}
return ca;
}
static bool IsArg(string arg)
{ return (arg.StartsWith("-") || arg.StartsWith("\\")); }
static string NextToken(string[] args, ref int ii)
{
ii++;
while (ii < args.Length)
{
string cur = args[ii].Trim();
if (cur != string.Empty) return cur;
ii++;
}
return null;
}
}
}
支援特性總覽
- 多種前綴:
-、--、\
- 鍵值分隔:空白或
=(-o file 或 -o=file)
- 值含空白:需雙引號包裹
--test = "the value"
- 布林旗標:無值參數預設
true(-v → v=true)
- 獨立參數:非旗標參數收集至
Params 列表
- 大小寫不敏感:旗標鍵名比較忽略大小寫
使用範例
string[] args = new string[] { "-u", "admin", "-p", "encrypted_token" };
CommandArgs ca = CommandLine.Parse(args);
// ca.ArgPairs["u"] == "admin"
// ca.ArgPairs["p"] == "encrypted_token"