2012-02-27 21 views
17

在我的Delphi应用程序中,我想添加命令行参数来自动设置登录屏幕中的一些参数。关于如何定义命令行参数的建议

目前我有一个登录屏幕,用户设置一些信息(如服务器,数据库,用户,密码,AuthenticationType,AUtoLogin,...)。

我使用MRU填充字段。无论如何,在大型组织中,有必要不要让用户选择任何信息。为此,我可以在我的场景中完成的最简单的事情就是使用命令行参数。

我的问题是你如何建议选择命令行参数?我的意思是,我应该去一个“位置”的做法或者一些“标签”的做法,例如:

MyProject.exe -s:MYSERVER -d:DATABASE 

MyProject.exe MYSERVER DATABASE 

在第一种情况下,我使用需要跨所有参数循环ParamStr和“解码”它们是什么。如果他们以“-s”开头:“我知道接下来是服务器名称。第二个更快更肮脏,但可能更有效。

如何管理包含“空间”的参数?是否有可能使用ParamStr自动拦截它们,还是应该手动处理所有内容? (我的意思是有没有办法自动告诉ParamStr这一个参数包含空格(如使用大括号或东西)。

什么是最好的做法是什么?

+6

使用双引号将包含空格的参数括起来。 – 2012-02-27 11:56:28

+0

我不知道为什么我尝试了所有的组合,但没有用双引号!谢谢。我注意到一件有趣的事情。如果我写:“-s:服务器名称”和-s:“服务器名称”,它们在ParamStr中被认为是相同的。这非常好,因为编写“-s:Server Name”不像用户友好的-s:“服务器名称”。 – LaBracca 2012-02-27 12:03:59

+0

第一种方法对您和最终用户来说更方便,更方便。为了“解码”参数,你可以使用'TStringList'(每行开始处带有'-'符号),并使用'Values'属性和'NameValueSeparator'设置为':' – teran 2012-02-27 12:07:42

回答

23

我应该走了“位置“方法或”标记“方法?

毫无疑问,您应该标记命令行参数。位置方法不允许有足够的灵活性来省略参数。标记使用户更容易理解参数特别是在返回到以前编写的代码时。标记应该是自我记录的。

一个常见的情况是,如果您有一个文件名或一个文件名列表,您将有无标记的参数。

如何管理包含“空格”的参数?

Windows惯例是通过在参数周围放置双引号来避免空格。 ParamStr解析将识别这些并相应地解析参数。您在ParamStr(i)中看到的内容是删除引号后的参数。


RTL带有一个有用的帮助函数来帮助您的命令行参数解析:FindCmdLineSwitch

+0

谢谢。另请参阅我上面的评论。 – LaBracca 2012-02-27 12:05:16

+0

哇,感谢FindCmdLineSwitch。我总是手动编码。 – LaBracca 2012-02-27 12:08:23

+2

@ user193655,IMO,'FindCmdLineSwitch'是你的假朋友。它带来了方便的糖和简单的开关,但使完全成熟的CLI真正头痛。考虑:'prog -x -r src dest'。而你关于“更好”语法的问题没有意义。问问你的高级用户,他们发现哪个CLI方便。 – OnTheFly 2012-02-27 12:42:14

7

你的第一个问题仅仅是品味问题。但是,我可以回答第二个问题。您使用双引号将包含空格的参数括起来。举例来说,如果你有

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

var 
    i: integer; 

begin 
    for i := 0 to ParamCount do 
    WriteLn(ParamStr(i)); 
    Readln; 
end. 

,并开始与参数one "two with spaces" three "four with spaces"的应用程序,那么你得到的输出

C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects\Project1.exe 
one 
two with spaces 
three 
four with spaces 
+0

是的有趣的事情是,它的作品也很好地使用:一个两个“与空间”三个四“与空间” – LaBracca 2012-02-27 12:06:33

0

我分隔参数(基于顺序)和选项(基于交换机的) 见例如“c:> help copy”。

11

德尔福包含一个非常好的单位称为CommandParser与TCommandParser类,为您做命令行解析。
既然它有virtually no documentation,这里有一些事情要开始。

我有一个HiddenExecutable example在我们的open source bo repository

基本上你:

  • 设置一个TComponent包含要公开作为命令行参数(即在HiddenExecuteSettingsUnit
  • 一个命令行解析器控制器THiddenExecuteSettings在我们的例子THiddenExecuteArgumentsTHiddenExecuteArgumentsUnit属性(回想起来不是这样一个好名字),它包含一个设置TCommandParser实例的方法
  • 然后执行一个AddSwitch个电话设置有两个缩写和全命令行开关(如hhelp
  • 然后,您可以调用ProcessCommandLine方法上TCommandParser实例来处理命令行,并填写您的TComponent的属性(在我的例子中的参数,这在ProcessCommandLine方法中完成)。

现在到了有趣:

  • TCommandParserHelpText方法是完全自动组装根据你喂什么它与AddSwitch方法帮助文件。
  • TCommandParser也有一个SaveOptions方法,允许您将TComponent的当前设置保存到设置文件中。

你需要的德尔福单位是这些,你可以从英巴卡迪诺radstudiodemos.sourceforge.net演示存储库中获得:

CommandParser in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\Utils\CommandParser.pas', 
PropertyHelpers in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\PropertyHelpers.pas', 
ParseIds in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\ParseIds.pas', 

编辑:John Kaster写了一个不错article on EDN包括more details on using the TCommandParser

+0

太糟糕了,我无法在德尔福XE7任何地方找到这个单位或其演示:( – 2015-03-08 23:48:30

+1

@JerryDodge你是对的;最后一个版本是XE6,在XE7中它们删除了所有的dbExpress演示,但它仍然可以在http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Object %20Pascal /数据库/的dbExpress/utils的/ CommandParser.pas – 2015-03-09 08:19:00