不知道这里有多少人和我一样喜欢CUI,很多程序我都喜欢写成CUI的来做,这样结合bat可以
组合出很强大的东东.但是命令行的参数处理是一个很繁琐的事,Main函数只是简单的切割
成了string数组,要弄成cmd那些拥有复杂选项的命令的话解析部分只有自己做╮(╯_╰)╭.这是前段时间做的一个Console程序的命令行解析部分整理后独立出来后再完善弄出的东西.
采用了我比较常用的windows script风格的命令行选项格式(/name:value 或 -name:value)
支持命名参数和匿名参数的识别,支持将命名参数值填充到对象的字段/属性填充时可以识别以下类型:整数(I1~I8都可,支持2进制,10进制,8进制,16进制的表达式),
浮点数(float/double)
布尔表达式(具体值或简化的表达式),
字符串(可使用转义以使用包含空白字符的字符串)
枚举类型(可以是任意自定义的enum,支持使用flags标记的选项枚举类型)具体可以看自带的txt文档和test调用示例Download
组合出很强大的东东.但是命令行的参数处理是一个很繁琐的事,Main函数只是简单的切割
成了string数组,要弄成cmd那些拥有复杂选项的命令的话解析部分只有自己做╮(╯_╰)╭.这是前段时间做的一个Console程序的命令行解析部分整理后独立出来后再完善弄出的东西.
采用了我比较常用的windows script风格的命令行选项格式(/name:value 或 -name:value)
支持命名参数和匿名参数的识别,支持将命名参数值填充到对象的字段/属性填充时可以识别以下类型:整数(I1~I8都可,支持2进制,10进制,8进制,16进制的表达式),
浮点数(float/double)
布尔表达式(具体值或简化的表达式),
字符串(可使用转义以使用包含空白字符的字符串)
枚举类型(可以是任意自定义的enum,支持使用flags标记的选项枚举类型)具体可以看自带的txt文档和test调用示例Download
D不填会死啊?
不填会死啊?
填会死啊?
会死啊?
死啊?
啊?
D不填会死啊?
不填会死啊?
填会死啊?
会死啊?
死啊?
啊?
比如csc /r:system.dll /t:library 1.cs
这样一段命令行,这个类库可以把它拆分成对应的名字到值的映射:
r->system.dll
t->library
另外附加的功能则是通过名字和一些预定表达式将值填充到对象的属性/字段
今天发现一个比较严重的bug:链表排序插入时一时粗心忘了处理字符串对比结果<0的情况
位于函数ArgumentAnalyzer.addNamedItem (analyzeContext context,string name,string value)中,会导致识别出了的参数的丢失囧...更正如下: void addNamedItem (analyzeContext context,string name,string value){//插入链表同时排序
var list = context.named;
//Console.WriteLine("named: {0}={1},{2}", name, value, list.Count);
if (list.First == null)
{
list.AddLast(new tempNamedArg(name, value));
return;
}
var node = list.First;
while (node != null)
{
var cmpresult = strCmp(name, node.Value.name); if (cmpresult == 0)
{
node.Value.values.Add(value);
return;
}
if (cmpresult > 0)
{
if (node.Next == null || strCmp(name, node.Next.Value.name) < 0)
{
//找到插入点,插入
list.AddAfter(node, new tempNamedArg(name, value));
return;
}
}
if (cmpresult < 0)
{
list.AddBefore(node, new tempNamedArg(name, value));
return;
}
node = node.Next;
}
}
/*
*Getopt.cs -- C#.NET port of Java port of GNU getopt from glibc 2.0.6
*/