Delphi是否有“getopt”的实现?

时间:2009-05-07 16:04:40

标签: delphi parsing com

使用getopt()解析C / C ++中的命令行参数并不容易。

Delphi有类似的东西吗?或者理想情况下,使用相同的语法?我知道Delphi支持FindCmdLineSwitch和ParamStr(),但那些仍然需要一些额外的解析。

我想要一些像C语言中的getopt()一样的东西。容易允许基本切换开关的东西,以及在切换后捕获值。请参阅下面的一些示例C代码,以了解我在说什么:

void print_help()
{
        printf("usage:\n") ;
        printf("\t\t-i set input file\n") ;
        printf("\t\t-o set output file\n") ;
        printf("\t\t-c set config file\n") ;
        printf("\t\t-h print this help information\n") ;
        printf("\t\t-v print version\n") ;
}
 char* input_file = NULL ;
        char *query=NULL;
          char opt_char=0;
        while ((opt_char = getopt(argc, argv, "i:q:vh")) != -1)
        {
                switch(opt_char)
                {
                        case 'h':
                                print_help();
                                exit(-1);
                                break;
                        case 'v':
                                print_version() ;
                                exit(-1) ;
                                break ;
                        case 'i':
                                input_file= optarg ;
                                break ;
                        case 'q':
                                query= optarg ;
                                break ;
                        default:
                                print_help();
                                exit(-1);
                                break;
                }
        }

8 个答案:

答案 0 :(得分:10)

有一个实现TGetOpt,声称

  

为Delphi实现getopt变体。它几乎与POSIX兼容,支持长选项,必需,可选和无参数

你可以找到它here

答案 1 :(得分:10)

FPC RTL的 getopts.pp 文件是自包含的Delphi(包含Delphi2009)兼容单元,实现了getopt:

  

Free Pascal的Getopt实现,   以GNU getopt为模型

unit可在FPC SVN存储库中找到。

答案 2 :(得分:7)

请参阅此EDN文章http://edn.embarcadero.com/print/40404中所述的TCommandParser,可在CodeCentral http://cc.embarcadero.com/item/27574下载。 TCommandParser现在也应该包含在Delphi演示中。在我离开之前,我已经将代码免费提供给Embarcadero,所以希望他们可以将它包含在框架中或类似的东西中。

答案 3 :(得分:3)

SysUtils单元中的FindCmdLineSwitch有什么问题?

if FindCmdLineSwitch('h',['-'],false) then
  Print_Help();
if FindCmdLineSwitch('v',['-'],false) then
  print_Version();

你必须通过params循环来获取值,但这很简单:

if FindCmdLineSwitch('f',['-'],false) then
  for ix := 1 to paramcount do
    if (paramStr(ix) = '-f') and (ix < paramcount) then
      begin
        if fileExists( ParamStr(ix+1) ) then
          filename := ParamStr(ix+1);
        break;
      end

答案 4 :(得分:2)

没有内置任何东西 - 但你可以轻松制作一个。这应该接近你习惯的

TsoCommandLineParser = class
private
  fArguments:TStringList;
public
  constructor Create();
  destructor Destroy(); override;

  function GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
end;


constructor TsoCommandLineParser.Create();
var
  i:Integer;
begin
  inherited Create();
  fArguments := TStringList.Create();
  for i := 1 to ParamCount() do
  begin
    fArguments.Add(ParamStr(i));
  end;
end;

destructor TsoCommandLineParser.Destroy();
begin
  fArguments.Free();
  inherited Destroy();
end;

function TsoCommandLineParser.GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
var
  i:Integer;
begin
  i := fArguments.IndexOfName(pArgument);
  if i > -1 then
  begin
    Result := fArguments.ValueFromIndex[i];
  end
  else
  begin
    Result := pDefaultValue;
  end;
end;

答案 5 :(得分:2)

还有一个名为delphi-argparse的新解析器与此问题相关。

答案 6 :(得分:1)

可以找到Delphi的基于属性的解析器here

答案 7 :(得分:0)

最近开源的“Gastown Delphi Command Line Parser”(例如on Torry's)。我从来没有用过它,所以我不能评论它。