我正在重新设计命令行应用程序,并且正在寻找一种方法来使其更直观。传递给命令行应用程序的参数格式是否有任何约定?或者人们发现有用的任何其他方法?
答案 0 :(得分:28)
我看到很多Windows命令行细节,但如果你的程序是针对Linux的,我发现GNU command line standard是最直观的。基本上,它使用双连字符作为命令的长形式(例如,--help
)和短版本的单个连字符(例如,-h
)。您还可以将短版本“叠加”在一起(例如,tar -zxvf
filename
),并将'n长短匹配“与您的心脏内容混合。
GNU网站还列出了standard option names。
getopt library极大地简化了解析这些命令的过程。如果C不是你的包,Python有一个类似的库,Perl也是如此。
答案 1 :(得分:13)
如果您正在使用C#try Mono.GetOptions,那么它是一个非常强大且易于使用的命令行参数解析器。它适用于Mono环境和Microsoft .NET Framework。
编辑:以下是一些功能
答案 2 :(得分:4)
我喜欢某些CLI的一个方面是使用快捷方式 即,以下所有行都在做同样的事情
myCli.exe describe someThing
myCli.exe descr someThing
myCli.exe desc someThing
这样,用户可能不必每次都输入all命令。
答案 3 :(得分:4)
一个好的和有用的参考:
https://commandline.codeplex.com/
NuGet提供的图书馆:
Install-Package CommandLineParser
。 Install-Package CommandLineParser -pre
。使用默认单例解析一行:CommandLine.Parser.Default.ParseArguments(...)
一行帮助屏幕生成器:HelpText.AutoBuild(...)
。
将命令行参数映射到IList<string>
,数组,枚举或标准标量类型
插件友好的架构如此处所述。
将动词命令定义为git commit -a
使用lambda表达式创建解析器实例。
快速入门:https://commandline.codeplex.com/wikipage?title=Quickstart&referringTitle=Documentation
// Define a class to receive parsed values
class Options {
[Option('r', "read", Required = true,
HelpText = "Input file to be processed.")]
public string InputFile { get; set; }
[Option('v', "verbose", DefaultValue = true,
HelpText = "Prints all messages to standard output.")]
public bool Verbose { get; set; }
[ParserState]
public IParserState LastParserState { get; set; }
[HelpOption]
public string GetUsage() {
return HelpText.AutoBuild(this,
(HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
}
}
// Consume them
static void Main(string[] args) {
var options = new Options();
if (CommandLine.Parser.Default.ParseArguments(args, options)) {
// Values are available here
if (options.Verbose) Console.WriteLine("Filename: {0}", options.InputFile);
}
}
答案 4 :(得分:3)
最好的办法是尽可能不承担任何责任。当操作员键入您的应用程序名称以执行并且没有任何参数时,可以使用USAGE块命中它们,或者在替代方法中打开Windows窗体并允许它们输入您需要的所有内容。
c:\>FOO
FOO
USAGE FOO -{Option}{Value}
-A Do A stuff
-B Do B stuff
c:\>
参数分隔我置于宗教话题的标题下:连字符(短划线),双连字符,斜线,无,位置等。
您没有指明您的平台,但是对于下一个评论,我将假设Windows和.net
您可以在.net中创建基于控制台的应用程序,并允许它使用Forms与桌面交互,只需选择基于控制台的项目,然后添加Windows.Forms,System.Drawing等DLL。
我们一直这样做。这确保没有人在黑暗的小巷里转弯。
答案 5 :(得分:3)
这是一篇可能会帮助你的CodeProject文章......
C#/.NET Command Line Arguments Parser
如果VB是你的风格,这里有一篇单独的文章(有更多的指导相关内容)来检查......
答案 6 :(得分:3)
命令行约定因操作系统而异,但可能得到最多使用和最公开审查的约定是GNU getopt包支持的约定。有关详细信息,请参阅 http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html。
它允许您将单个字母命令(如-nr)与较长的自记录选项(如--numeric --reverse)混合使用。很好,并实现--help( - ?)选项,然后您的用户将能够找出他们需要知道的所有内容。
答案 7 :(得分:3)
补充@ vonc的答案,不要接受含糊不清的缩写。例如:
myCli.exe describe someThing
myCli.exe destroy someThing
myCli.exe des someThing ???
事实上,在这种情况下,我可能不会接受“destroy”的缩写......
答案 8 :(得分:2)
我总是添加/?获取帮助的参数,我总是尝试使用默认(即最常见的场景)实现。
否则我倾向于对开关使用“/ x”,对需要传递值的开关使用“/ x:value”。使用正则表达式解析参数非常容易。
答案 9 :(得分:1)
我开发了这个框架,也许有帮助:
SysCommand是一个功能强大的跨平台框架,用于在.NET中开发控制台应用程序。简单,类型安全,并且受MVC模式的影响很大。
https://github.com/juniorgasparotto/SysCommand
namespace Example.Initialization.Simple
{
using SysCommand.ConsoleApp;
public class Program
{
public static int Main(string[] args)
{
return App.RunApplication();
}
}
// Classes inheriting from `Command` will be automatically found by the system
// and its public properties and methods will be available for use.
public class MyCommand : Command
{
public void Main(string arg1, int? arg2 = null)
{
if (arg1 != null)
this.App.Console.Write(string.Format("Main arg1='{0}'", arg1));
if (arg2 != null)
this.App.Console.Write(string.Format("Main arg2='{0}'", arg2));
}
public void MyAction(bool a)
{
this.App.Console.Write(string.Format("MyAction a='{0}'", a));
}
}
}
<强>试验:强>
// auto-generate help
$ my-app.exe help
// method "Main" typed
$ my-app.exe --arg1 value --arg2 1000
// or without "--arg2"
$ my-app.exe --arg1 value
// actions support
$ my-app.exe my-action -a
答案 10 :(得分:0)
我刚刚发布了一个更好的命令行解析器
https://github.com/gene-l-thomas/coptions
这是关于nuget 安装包邮件
using System;
using System.Collections.Generic;
using coptions;
[ApplicationInfo(Help = "This program does something useful.")]
public class Options
{
[Flag('s', "silent", Help = "Produce no output.")]
public bool Silent;
[Option('n', "name", "NAME", Help = "Name of user.")]
public string Name
{
get { return _name; }
set { if (String.IsNullOrWhiteSpace(value))
throw new InvalidOptionValueException("Name must not be blank");
_name = value;
}
}
private string _name;
[Option("size", Help = "Size to output.")]
public int Size = 3;
[Option('i', "ignore", "FILENAME", Help = "Files to ignore.")]
public List<string> Ignore;
[Flag('v', "verbose", Help = "Increase the amount of output.")]
public int Verbose = 1;
[Value("OUT", Help = "Output file.")]
public string OutputFile;
[Value("INPUT", Help = "Input files.")]
public List<string> InputFiles;
}
namespace coptions.ReadmeExample
{
class Program
{
static int Main(string[] args)
{
try
{
Options opt = CliParser.Parse<Options>(args);
Console.WriteLine(opt.Silent);
Console.WriteLine(opt.OutputFile);
return 0;
}
catch (CliParserExit)
{
// --help
return 0;
} catch (Exception e)
{
// unknown options etc...
Console.Error.WriteLine("Fatal Error: " + e.Message);
return 1;
}
}
}
}
支持自动 - 帮助生成,动词,例如commmand.exe
享受。
答案 11 :(得分:0)
-operation [parameters] -command [your command] -anotherthings [otherparams] ....
例如,
YourApp.exe -file %YourProject.prj% -Secure true
答案 12 :(得分:0)
我创建了一个包含命令行解析器的.Net C#库。您只需要创建一个继承自CmdLineObject类的类,调用Initialize,它将自动填充属性。它可以处理不同类型的转换(使用项目中也包含的高级转换库),数组,命令行别名,click-once参数等。它甚至可以自动创建命令行帮助(/?)。
如果您感兴趣,项目的网址为http://bizark.codeplex.com。它目前仅作为源代码提供。
答案 13 :(得分:0)
如果您使用的是Perl,我的CLI::Application框架可能就是您所需要的。它允许您轻松地使用SVN / CVS / GIT(如用户界面)构建应用程序(“您的命令-o --long-opt some-action-to-execute some parameters”)。
答案 14 :(得分:0)
您为应用程序使用的约定取决于
1)它是什么类型的应用程序。 2)您正在使用的操作系统。
这绝对是真的。我不确定dos-prompt约定,但在类似unix的系统上,一般约定大致是:
1)格式化
appName参数
2)单个字符参数(例如'x')作为-x传递 3)多字符参数(例如'add-keys')作为--add-keys
传递答案 15 :(得分:0)
您为应用程序使用的约定取决于
1)它是什么类型的应用。
2)您正在使用的操作系统。 Linux呢?视窗?它们都有不同的惯例。
我建议的是查看系统上其他命令的其他命令行界面,特别注意传递的参数。参数不正确应该为用户提供解决方案定向错误消息。易于查找的帮助屏幕也有助于实现可用性。
不知道你的应用程序究竟会做什么,很难给出具体的例子。
答案 16 :(得分:0)
如果您使用其中一个标准工具生成命令行界面,例如getopts,那么您将自动符合。