【问题标题】:Suggestions for how to define command line parameters关于如何定义命令行参数的建议
【发布时间】:2012-02-27 11:54:21
【问题描述】:

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

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

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

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

MyProject.exe -s:MYSERVER -d:DATABASE

MyProject.exe MYSERVER DATABASE

在第一种情况下,我需要使用 ParamStr 遍历所有参数并“解码”它们是什么。如果它们以“-s:”开头,我知道后面是服务器名称。第二种更快更脏,但可能更有效。

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

最佳做法是什么?

【问题讨论】:

  • 您使用双引号将包含空格的参数括起来。
  • 我不知道为什么我尝试了所有组合但没有使用双引号!。谢谢。我注意到一件有趣的事情。如果我写:“-s:服务器名称”和 -s:“服务器名称”,它们在 ParamStr 中被认为是相同的。这很好,因为写“-s:Server Name”不像-s:“Server Name”那样用户友好。
  • 第一种方法对您和最终用户来说更方便和容易..“解码”参数您可以使用TStringList(在每行的开头去掉-符号)并使用它的Valuesproperty 与 NameValueSeparator 设置为 :
  • 我相信如果需要一个参数,那么它应该是“位置的”。如果它是可选的,那么它应该被“标记”。
  • @Nat 位置参数的缺点是人类读者很难解析它们。当然,这对计算机来说是清楚的,但想想可怜的人类!位置参数还可以使命令行的重构更具挑战性。

标签: delphi paramstr


【解决方案1】:

我应该采用“定位”方法还是某种“标签”方法?

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

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

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

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


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

【讨论】:

  • 谢谢。另请参阅我上面的评论。
  • 哇,感谢 FindCmdLineSwitch。我总是手动编码。
  • @user193655, IMO, FindCmdLineSwitch 是你的假朋友。它通过简单的开关带来了方便的糖,但使完全成熟的 CLI 真正令人头疼。考虑:prog -x -r src dest。而且您关于“更好”语法的问题毫无意义。而是询问您的高级用户,他们觉得哪个 CLI 方便。
  • 我同意这一点。为了能够处理这样的参数,这是我的回答中描述的“常见场景”,你真的希望参数解析器吃掉开关/选项,剩下的参数留给你。
【解决方案2】:

Delphi 包含一个名为 CommandParser 的非常好的单元,它带有一个 TCommandParser 类,可以为您进行命令行解析。
既然它有virtually no documentation,这里有一些事情要开始。

我的open source bo repository 有一个HiddenExecutable example

基本上你:

  • 设置一个TComponent,其中包含您要作为命令行参数公开的属性(即HiddenExecuteSettingsUnit 中的THiddenExecuteSettings
  • 一个命令行解析器控制器。在我们的例子中,THiddenExecuteArgumentsTHiddenExecuteArgumentsUnit 中(回想起来不是一个好名字),它包含一个 InitCommandLine 方法,该方法设置一个 TCommandParser 实例,将它传递给你的 TComponent
  • 然后它会执行几个 AddSwitch 调用,以使用缩写和完整的命令行开关(如 hhelp)设置参数
  • 然后您可以在TCommandParser 实例上调用ProcessCommandLine 方法来处理命令行并填充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',

编辑:John Kaster 写了一个很好的article on EDN,其中包括more details on using the TCommandParser

【讨论】:

  • 太糟糕了,我在 Delphi XE7 或其演示中的任何地方都找不到这个单元 :(
  • @JerryDodge 你是对的;它在示例中发布的最后一个版本是 XE6。在 XE7 中,他们删除了所有 dbExpress 演示,但它仍然在线 sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/…
【解决方案3】:

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

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

【讨论】:

  • 是的,有趣的是它也可以很好地使用:一二“带空格”三四“带空格”
【解决方案4】:

我将参数(基于顺序)和选项(基于开关)分开 例如,参见“c:>help copy”。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2011-06-14
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多