如何将包含双引号的变量传递给Cygwin中的Delphi可执行文件?

时间:2018-10-02 10:10:05

标签: delphi cygwin

我试图获取多个参数,每个参数包含以空格分隔的标记,因此将其引号。但是,当Cygwin通过bash变量提供整个参数集时,Delphi无法识别它。

Project1.sh

./Project1.exe "a b c d"
arg='"a b c d"'  
./Project1.exe $arg

Project1.pas

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ParamCount do begin
    Memo1.Lines.Add(ParamStr(I));
    if AnsiEndsText('\', ParamStr(I)) then
    begin
      raise Exception.Create(ParamStr(I));
    end;
  end;
end;

期望的条目是a b c d,由./Project1.exe "a b c d"给出。

尽管如此,./Project1.exe $arg仅给出\a b c d\

您能否评论一下Cygwin中是否可以使用变量获取a b c d

1 个答案:

答案 0 :(得分:1)

运行Project1.exe "a b c d"时,只有一个参数,其值仅为a b c d。双引号不是参数值本身的一部分,它们只是分隔符,用于让命令行处理器知道其中包含嵌入空格的单个参数。

运行Project1.exe $arg时,您在参数值中包含双引号,因此在命令行中传递时,必须将其转义为\",因此您可以将参数传递为"\"a b c d\""。但是,Delphi's ParamStr() does not support \" escaping, and it strips off all " characters。因此,您最终得到的是参数值\a b c d\

如果只希望参数值为a b c d,请删除变量中的双引号:

arg='a b c d'

否则,您将必须直接调用GetCommandLine(),然后自己手动解析,或使用CommandLineToArgvW()(其中does support \" escaping)。