我试图获取多个参数,每个参数包含以空格分隔的标记,因此将其引号。但是,当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
?
答案 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)。