在C#中解析命令行参数的最佳方法? [关闭]
构建带有参数的控制台应用程序时,可以使用传递给Main(string[] args)
。
过去,我只是索引/循环该数组,并做了一些正则表达式来提取值。 但是,当命令变得更复杂时,解析可能会变得很丑陋。
所以我对以下内容感兴趣:
- 您使用的库
- 您使用的模式
假定命令始终遵循通用标准,例如此处回答 。
#1楼
Powershell Commandlet。
Powershell会根据命令行小程序上指定的属性进行解析,支持验证,参数集,流水线,错误报告,帮助,以及在其他命令行小程序中使用的所有返回的.NET对象中的最佳功能。
我发现几个链接对入门很有帮助:
- 快速入门教程
- MSDN上的编程指南
- MSDN上的命名空间参考
#2楼
C#CLI是我编写的一个非常简单的命令行参数解析库。 它是有据可查的开源软件。
#3楼
这是我基于Novell Options
类编写的处理程序。
这是针对执行while (input !="exit")
样式循环的控制台应用程序的,例如FTP控制台之类的交互式控制台。
用法示例:
static void Main(string[] args)
{// SetupCommandHandler handler = new CommandHandler();CommandOptions options = new CommandOptions();// Add some commands. Use the v syntax for passing argumentsoptions.Add("show", handler.Show).Add("connect", v => handler.Connect(v)).Add("dir", handler.Dir);// Read linesSystem.Console.Write(">");string input = System.Console.ReadLine();while (input != "quit" && input != "exit"){if (input == "cls" || input == "clear"){System.Console.Clear();}else{if (!string.IsNullOrEmpty(input)){if (options.Parse(input)){System.Console.WriteLine(handler.OutputMessage);}else{System.Console.WriteLine("I didn't understand that command");}}}System.Console.Write(">");input = System.Console.ReadLine();}
}
以及来源:
/// <summary>
/// A class for parsing commands inside a tool. Based on Novell Options class (http://www.ndesk.org/Options).
/// </summary>
public class CommandOptions
{private Dictionary<string, Action<string[]>> _actions;private Dictionary<string, Action> _actionsNoParams;/// <summary>/// Initializes a new instance of the <see cref="CommandOptions"/> class./// </summary>public CommandOptions(){_actions = new Dictionary<string, Action<string[]>>();_actionsNoParams = new Dictionary<string, Action>();}/// <summary>/// Adds a command option and an action to perform when the command is found./// </summary>/// <param name="name">The name of the command.</param>/// <param name="action">An action delegate</param>/// <returns>The current CommandOptions instance.</returns>public CommandOptions Add(string name, Action action){_actionsNoParams.Add(name, action);return this;}/// <summary>/// Adds a command option and an action (with parameter) to perform when the command is found./// </summary>/// <param name="name">The name of the command.</param>/// <param name="action">An action delegate that has one parameter - string[] args.</param>/// <returns>The current CommandOptions instance.</returns>public CommandOptions Add(string name, Action<string[]> action){_actions.Add(name, action);return this;}/// <summary>/// Parses the text command and calls any actions associated with the command./// </summary>/// <param name="command">The text command, e.g "show databases"</param>public bool Parse(string command){if (command.IndexOf(" ") == -1){// No paramsforeach (string key in _actionsNoParams.Keys){if (command == key){_actionsNoParams[key].Invoke();return true;}}}else{// Paramsforeach (string key in _actions.Keys){if (command.StartsWith(key) && command.Length > key.Length){string options = command.Substring(key.Length);options = options.Trim();string[] parts = options.Split(' ');_actions[key].Invoke(parts);return true;}}}return false;}
}
#4楼
Genghis Command Line Parser可能有点过时了,但是功能非常完整,对我来说效果很好。
#5楼
我不久前写了一个C#命令行参数解析器。 它位于: http : //www.codeplex.com/CommandLineArguments
#6楼
我强烈建议使用NDesk.Options ( 文档 )和/或Mono.Options (相同的API,不同的名称空间)。 文档中的示例 :
bool show_help = false;
List<string> names = new List<string> ();
int repeat = 1;var p = new OptionSet () {{ "n|name=", "the {NAME} of someone to greet.",v => names.Add (v) },{ "r|repeat=", "the number of {TIMES} to repeat the greeting.\n" + "this must be an integer.",(int v) => repeat = v },{ "v", "increase debug message verbosity",v => { if (v != null) ++verbosity; } },{ "h|help", "show this message and exit", v => show_help = v != null },
};List<string> extra;
try {extra = p.Parse (args);
}
catch (OptionException e) {Console.Write ("greet: ");Console.WriteLine (e.Message);Console.WriteLine ("Try `greet --help' for more information.");return;
}
#7楼
有许多解决此问题的方法。 为了完整性和提供替代方案(如果有人希望的话),我在我的google代码库中为两个有用的类添加了这个答案。
第一个是ArgumentList,它仅负责解析命令行参数。 它收集由开关“ / x:y”或“ -x = y”定义的名称/值对,并收集“未命名”条目的列表。 在这里讨论它的基本用法,在这里 查看类 。
第二部分是CommandInterpreter ,它从.Net类中创建一个功能齐全的命令行应用程序。 举个例子:
using CSharpTest.Net.Commands;
static class Program
{static void Main(string[] args){new CommandInterpreter(new Commands()).Run(args);}//example ‘Commands’ class:class Commands{public int SomeValue { get; set; }public void DoSomething(string svalue, int ivalue){ ... }
使用上面的示例代码,您可以运行以下代码:
Program.exe DoSomething“字符串值” 5
- 要么 -
Program.exe处理/ ivalue = 5 -svalue:“字符串值”
就这么简单,或者像您需要的那样复杂。 您可以查看源代码 , 查看帮助或下载二进制文件 。
#8楼
看起来每个人都有自己的宠物命令行解析器,图我最好也添加我的:)。
http://bizark.codeplex.com/
该库包含一个命令行解析器 ,它将使用命令行中的值初始化一个类。 它具有大量功能(多年来我一直在构建它)。
从文档中 ...
BizArk框架中的命令行分析具有以下关键功能:
- 自动初始化:类属性是根据命令行参数自动设置的。
- 默认属性:发送一个值而不指定属性名称。
- 值转换:使用BizArk中也包含的功能强大的ConvertEx类将值转换为正确的类型。
- 布尔型标志:可以通过简单地使用参数(例如,ex,/ b为true,/ b-为false)或通过添加值true / false,yes / no等来指定标志。
- 参数数组:只需在命令行名称后添加多个值即可设置定义为数组的属性。 例如,/ x 1 2 3将用数组{1,2,3}填充x(假设x被定义为整数数组)。
- 命令行别名:一个属性可以支持多个命令行别名。 例如,帮助使用别名?。
- 部分名称识别:您无需拼写全名或别名,只需拼写足够多的语法分析器即可将属性/别名与其他属性区分开。
- 支持ClickOnce:即使在URL中为已部署的ClickOnce应用程序将其指定为查询字符串,也可以初始化属性。 命令行初始化方法将检测它是否以ClickOnce的形式运行,因此使用它时无需更改代码。
- 自动创建/? 帮助:这包括考虑到控制台宽度的良好格式。
- 将命令行参数加载/保存到文件:如果您要运行多个大型,复杂的命令行参数集,则此功能特别有用。
#9楼
我建议使用开源库CSharpOptParse 。 它解析命令行,并使用命令行输入合并用户定义的.NET对象。 在编写C#控制台应用程序时,我总是转向该库。
#10楼
看看http://github.com/mono/mono/tree/master/mcs/class/Mono.Options/
#11楼
我喜欢那个 ,因为您可以为参数“定义规则”,无论是否需要,...
或者如果您是Unix人士,那么您可能会喜欢GNU Getopt .NET端口。
#12楼
WPF TestApi库带有用于C#开发的最好的命令行解析器之一。 我强烈建议您从Ivo Manolov的API博客中进行调查 :
// EXAMPLE #2:
// Sample for parsing the following command-line:
// Test.exe /verbose /runId=10
// This sample declares a class in which the strongly-
// typed arguments are populated
public class CommandLineArguments
{bool? Verbose { get; set; }int? RunId { get; set; }
}CommandLineArguments a = new CommandLineArguments();
CommandLineParser.ParseArguments(args, a);
#13楼
我个人最喜欢的是Peter Palotas的http://www.codeproject.com/KB/recipes/plossum_commandline.aspx :
[CommandLineManager(ApplicationName="Hello World",Copyright="Copyright (c) Peter Palotas")]
class Options
{[CommandLineOption(Description="Displays this help text")]public bool Help = false;[CommandLineOption(Description = "Specifies the input file", MinOccurs=1)]public string Name{get { return mName; }set{if (String.IsNullOrEmpty(value))throw new InvalidOptionValueException("The name must not be empty", false);mName = value;}}private string mName;
}
#14楼
我最近遇到了我非常喜欢的FubuCore命令行解析实现,原因是:
- 它很容易使用-尽管我找不到它的文档,但是FubuCore解决方案还提供了一个项目,其中包含一组不错的单元测试,这些单元测试比任何文档都讲更多的功能。
- 它具有出色的面向对象设计,没有代码重复或我以前在命令行解析应用中拥有的其他类似内容
- 这是声明性的:您基本上是为Commands和参数集编写类,并用属性装饰它们以设置各种选项(例如,名称,描述,强制/可选)
- 库甚至根据这些定义打印出一个不错的使用图
以下是有关如何使用此功能的简单示例。 为了说明这种用法,我编写了一个简单的实用程序,其中包含两个命令:-添加(将对象添加到列表中-对象由名称(字符串),值(int)和布尔值标志组成)-列表(列表所有当前添加的对象)
首先,我为“ add”命令编写了一个Command类:
[Usage("add", "Adds an object to the list")]
[CommandDescription("Add object", Name = "add")]
public class AddCommand : FubuCommand<CommandInput>
{public override bool Execute(CommandInput input){State.Objects.Add(input); // add the new object to an in-memory collectionreturn true;}
}
此命令将CommandInput实例作为参数,因此接下来我将其定义为:
public class CommandInput
{[RequiredUsage("add"), Description("The name of the object to add")]public string ObjectName { get; set; }[ValidUsage("add")][Description("The value of the object to add")]public int ObjectValue { get; set; }[Description("Multiply the value by -1")][ValidUsage("add")][FlagAlias("nv")]public bool NegateValueFlag { get; set; }
}
下一个命令是“列表”,其实现方式如下:
[Usage("list", "List the objects we have so far")]
[CommandDescription("List objects", Name = "list")]
public class ListCommand : FubuCommand<NullInput>
{public override bool Execute(NullInput input){State.Objects.ForEach(Console.WriteLine);return false;}
}
'list'命令不带任何参数,因此我为此定义了一个NullInput类:
public class NullInput { }
现在剩下的就是将它连接到Main()方法中,如下所示:
static void Main(string[] args){var factory = new CommandFactory();factory.RegisterCommands(typeof(Program).Assembly);var executor = new CommandExecutor(factory);executor.Execute(args);}
该程序按预期工作,在任何命令无效的情况下,会打印有关正确用法的提示:
------------------------Available commands:------------------------add -> Add objectlist -> List objects------------------------
以及“ add”命令的示例用法:
Usages for 'add' (Add object)add <objectname> [-nv]-------------------------------------------------Arguments-------------------------------------------------objectname -> The name of the object to addobjectvalue -> The value of the object to add--------------------------------------------------------------------------------------Flags-------------------------------------[-nv] -> Multiply the value by -1-------------------------------------
#15楼
请使用apache commons cli API的.net端口。 这很好。
http://sourceforge.net/projects/dotnetcli/
以及用于概念和介绍的原始API
http://commons.apache.org/cli/
#16楼
一个非常简单易用的临时类,用于命令行解析,它支持默认参数。
class CommandLineArgs
{public static CommandLineArgs I{get{return m_instance;}}public string argAsString( string argName ){if (m_args.ContainsKey(argName)) {return m_args[argName];}else return "";}public long argAsLong(string argName){if (m_args.ContainsKey(argName)){return Convert.ToInt64(m_args[argName]);}else return 0;}public double argAsDouble(string argName){if (m_args.ContainsKey(argName)){return Convert.ToDouble(m_args[argName]);}else return 0;}public void parseArgs(string[] args, string defaultArgs ){m_args = new Dictionary<string, string>();parseDefaults(defaultArgs );foreach (string arg in args){string[] words = arg.Split('=');m_args[words[0]] = words[1];}}private void parseDefaults(string defaultArgs ){if ( defaultArgs == "" ) return;string[] args = defaultArgs.Split(';');foreach (string arg in args){string[] words = arg.Split('=');m_args[words[0]] = words[1];}}private Dictionary<string, string> m_args = null;static readonly CommandLineArgs m_instance = new CommandLineArgs();
}class Program
{static void Main(string[] args){CommandLineArgs.I.parseArgs(args, "myStringArg=defaultVal;someLong=12");Console.WriteLine("Arg myStringArg : '{0}' ", CommandLineArgs.I.argAsString("myStringArg"));Console.WriteLine("Arg someLong : '{0}' ", CommandLineArgs.I.argAsLong("someLong"));}
}
#17楼
我真的很喜欢命令行解析器库( http://commandline.codeplex.com/ )。 它具有通过属性设置参数的非常简单而优雅的方法:
class Options
{[Option("i", "input", Required = true, HelpText = "Input file to read.")]public string InputFile { get; set; }[Option(null, "length", HelpText = "The maximum number of bytes to process.")]public int MaximumLenght { get; set; }[Option("v", null, HelpText = "Print details during execution.")]public bool Verbose { get; set; }[HelpOption(HelpText = "Display this help screen.")]public string GetUsage(){var usage = new StringBuilder();usage.AppendLine("Quickstart Application 1.0");usage.AppendLine("Read user manual for usage instructions...");return usage.ToString();}
}
#18楼
在http://www.codeplex.com/commonlibrarynet上有一个命令行参数解析器
它可以使用解析参数
1.属性
2.明确的电话
3.多参数或字符串数组的单行
它可以处理以下内容:
- 配置 :QA - STARTDATE:$ {} 今天 - 区域 : '纽约' Settings01
它很容易使用。
#19楼
你可能会喜欢我的一个地毯
易于使用且可扩展的命令行参数解析器。 句柄:布尔,加号/减号,字符串,字符串列表,CSV,枚举。
内建'/?' 帮助模式。
内建'/ ??' 和'/?D'文档生成器模式。
static void Main(string[] args)
{ // create the argument parserArgumentParser parser = new ArgumentParser("ArgumentExample", "Example of argument parsing");// create the argument for a stringStringArgument StringArg = new StringArgument("String", "Example string argument", "This argument demonstrates string arguments");// add the argument to the parser parser.Add("/", "String", StringArg);// parse arguemntsparser.Parse(args);// did the parser detect a /? argument if (parser.HelpMode == false) {// was the string argument defined if (StringArg.Defined == true){// write its valueRC.WriteLine("String argument was defined");RC.WriteLine(StringArg.Value);}}
}
编辑:这是我的项目,因此,此答案不应被视为第三方的认可。 就是说,我确实将它用于我编写的每个基于命令行的程序,它是开源的,我希望其他人可以从中受益。
#20楼
CLAP (命令行参数解析器)具有可用的API,并且文档详尽。 您可以制作一个方法,并为参数添加注释。 https://github.com/adrianaisemberg/CLAP
在C#中解析命令行参数的最佳方法? [关闭]相关推荐
- 如何在Java中解析命令行参数?
在Java中解析命令行参数的好方法是什么? #1楼 我不建议使用Apache Common CLI库,因为它是非线程安全的. 它使用带有静态变量和方法的有状态类来进行内部工作(例如OptionBuil ...
- vs2013中带命令行参数的调试方法
@VS2013带命令行参数的调试方法 在C++函数参数传递中,我们知道,main函数是演示C++程序如何向函数传递数组的好例子.一般来说,我们定义的大多main函数都只有空的形参列表: int mai ...
- linux 中解析命令行参数 (getopt_long用法)
getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下: #include <getopt.h> int getopt_long ...
- java 命令行 解析_如何在Java中解析命令行参数?
小编典典 例如,这是你commons-cli用来解析2个字符串参数的方法: import org.apache.commons.cli.*; public class Main { public st ...
- python 命令-python解析命令行参数的三种方法详解
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...
- C语言中使用库函数解析命令行参数
在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...
- Python 中的解析命令行参数
argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生 ...
- Python3中使用argparse模块解析命令行参数
argparse是Python的一个标准模块,用于解析命令行参数,即解析sys.argv中定义的参数.实现在:https://github.com/python/cpython/blob/main/L ...
- python使用argparse解析命令行参数
python使用argparse解析命令行参数 你的程序如何能够解析命令行选项(位于sys.argv中) #示意使用sys.argv进行参数解析: #注意,sys.argv中第0个索引是函数本身,所以 ...
最新文章
- 【算法python实现】 -- 岛屿的个数
- LS-DYNA常用关键字
- Visual C++中error spawning cl.exe解决办法
- “ddl”有一个无效 SelectedValue,因为它不在项目列表中。
- 编程填空:学生信息处理程序_项目学生:业务层
- TreeTemplate树模板
- 添加蜂窝注册表及永久存储
- Java笔记(一)—StringBuilder类
- dos系统功能调用的屏幕显示字符是( )号调用_四、WIN10模拟DOS环境之8086汇编实战...
- 史诗巨作[关云长][高清BD-RMVB/992M][国语/中文字幕]
- Debian Chroot on Synology NAS
- LinkedIn登录第三方网站
- 斐讯K1、K2、K2P 刷机、刷入Breed@重庆网吧电竞酒店维护小哥
- 自然语言处理——字符串基础操作及应用
- 【面试智力题】一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,怎样拿到最大的一颗?
- OOP 概念的编程基础思想----我的感想
- 服务器 z盘 映射,小脚本:在终端上映射网络驱动器Z盘
- 半波对称振子方向图_HFSS:对称振子天线的方向图,为什么不对称?
- QQ邮箱添加企业邮箱与企业邮箱添加QQ邮箱
- blender中python脚本使用