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

LaB*_*cca 18 delphi paramstr

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

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

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

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

MyProject.exe -s:MYSERVER -d:DATABASE
Run Code Online (Sandbox Code Playgroud)

要么

MyProject.exe MYSERVER DATABASE
Run Code Online (Sandbox Code Playgroud)

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

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

什么是最佳做法?

Dav*_*nan 23

我应该采用"位置"方法还是某种"标记"方法?

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

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

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

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


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

  • @ user193655,IMO,`FindCmdLineSwitch`是你的假朋友.它通过简单的开关带来方便的糖,但使完全成熟的CLI成为一个真正令人头痛的问题.考虑:`prog -x -r src dest`.关于"更好"语法的问题没什么意义.请询问您的高级用户,他们发现哪个CLI很方便. (2认同)

Jer*_*ers 12

Delphi包含一个非常好的单元,名为CommandParser,带有一个TCommandParser类,可以为您执行命令行解析.
由于它几乎没有文档,这里有一些入门的东西.

我在我们的开源bo存储库中有一个HiddenExecutable示例.

基本上你:

  • 设置TComponent包含要作为命令行参数公开的属性(THiddenExecuteSettingsHiddenExecuteSettingsUnit中)
  • 命令行解析器控制器.在我们的情况下THiddenExecuteArguments,在THiddenExecuteArgumentsUnit(回想起来不是这么好的名字)中,它包含一个InitCommandLine设置TCommandParser实例的方法,并将其传递给你TComponent
  • 然后它执行几个AddSwitch调用来设置带有缩位和完整命令行开关的参数(比如hhelp)
  • 然后,您可以ProcessCommandLineTCommandParser实例上调用该方法来处理命令行并填充您的属性TComponent(在我的示例中,这是在ProcessCommandLine方法中完成的).

现在来了很有趣:

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

您需要的Delphi单元是您可以从Embarcadero 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',
Run Code Online (Sandbox Code Playgroud)

编辑: John Kaster 在EDN上写了一篇很好的文章,其中包含有关使用TCommandParser的更多细节.


And*_*and 7

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

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i: integer;

begin
  for i := 0 to ParamCount do
    WriteLn(ParamStr(i));
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

并使用参数启动应用程序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
Run Code Online (Sandbox Code Playgroud)