有关如何定义命令行参数的建议

时间:2012-02-27 11:54:22

标签: delphi paramstr

在我的Delphi应用程序中,我想添加命令行参数以在登录屏幕中自动设置一些参数。

目前我有一个登录界面,用户可以在其中设置一些信息(如服务器,数据库,用户,密码,AuthenticationType,AUtoLogin等)。

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

我的问题是你如何建议选择命令行参数?我的意思是,我应该采用“位置”方法还是某种“标记”方法,例如:

MyProject.exe -s:MYSERVER -d:DATABASE

MyProject.exe MYSERVER DATABASE

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

如何管理包含“空格”的参数?是否可以使用ParamStr自动拦截它们,还是应该手动处理所有? (我的意思是有一种方法可以自动告诉ParamStr一个参数包含一个空格(比如使用大括号或其他东西)。

最佳做法是什么?

4 个答案:

答案 0 :(得分:23)

  

我应该选择“位置”方法还是某种“标记”方法?

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

当您拥有未标记的参数时,一种常见的情况是您拥有文件名或文件名列表。

  

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

Windows约定是通过在参数周围加上双引号来转义空格。 ParamStr解析将识别这些并相应地解析参数。您在ParamStr(i)中看到的是删除了引号的参数。


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

答案 1 :(得分:11)

Delphi包含一个非常好的单元,名为CommandParser,带有TCommandParser类,可以为您执行命令行解析。
由于它有virtually no documentation,因此以下是一些要开始的事情。

我的HiddenExecutable example有一个open source bo repository

基本上你:

  • 设置TComponent,其中包含您要作为命令行参数公开的属性(HiddenExecuteSettingsUnit
  • 中的THiddenExecuteSettings
  • 命令行解析器控制器。在我们的THiddenExecuteArgumentsUnitTHiddenExecuteArguments(回想起来并不是一个好名字),其中包含一个InitCommandLine方法,用于设置TCommandParser实例,并将TComponent
  • 然后执行几个AddSwitch调用,使用缩写和完整命令行开关设置参数(例如hhelp
  • 然后,您可以调用ProcessCommandLine实例上的TCommandParser方法来处理命令行并填充TComponent的属性(在我的示例中,这是在{{1}中完成的方法)。

现在很有趣:

  • ProcessCommandLineTCommandParser方法,可以根据您使用HelpText方法提供的内容完全自动组合帮助文本。
  • AddSwitch还有TCommandParser方法,可让您将TComponent的当前设置保存到设置文件中。

您需要的德尔福单位是您可以从Embarcadero radstudiodemos.sourceforge.net演示库获得的:

SaveOptions

修改: John Kaster写了一封包含article on EDN的好more details on using the TCommandParser

答案 2 :(得分: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

答案 3 :(得分:0)

我将单独的参数(基于订单)和选项(基于交换机)分开 例如,请参阅“c:>帮助副本”。