我正在尝试将自定义命令行参数传递给使用Inno Setup创建的安装程序。参数值实际上包含几个参数,这些参数将在安装完成时用于启动已安装的程序,因此该值包含空格以及将参数组合在一起的引号。
例如,-arg "C:\path with spaces" -moreargs
在Parameters
部分条目中[Run]
应该用作setup.exe /abc="-arg "C:\path with spaces" -moreargs"
时,我想像这样启动安装程序:
[Code]
通过ParamStr()
输出安装程序在/abc=-arg C:\path
部分中收到的参数,显示它们(当然)分开:with
,spaces -moreargs
,setup.exe /abc="-arg ""C:\path with spaces"" -moreargs"
如何逃避报价以保留它们?
我尝试将内部引号加倍:
/abc=-arg C:\path with spaces -moreargs
这正确地将参数保持在一起(ParamStr()
),但似乎ParamStr()
删除了所有引号。
有没有办法在使用{param:abc|DefaultValue}
或参数常量GetCmdTail
检索的参数中保留引号?
替代方案似乎是从ParamStr()
(包含原始参数字符串)进行自己的参数解析,或使用另一个字符而不是ls /usr/lib | grep "[02468].0.0$"
中保留的内部引号然后替换它们随后报价。但如果有办法使用内置函数,我宁愿不这样做。
答案 0 :(得分:0)
似乎{param}
和ParamStr()
都删除了双引号,但是正如您指出的(谢谢!),GetCmdTail
函数返回原始值。
所以这是一个用引号获取原始参数的函数:
function ParamStrWithQuotes(ParamName: String) : string;
var
fullCmd : String;
currentParamName : string;
i : Integer;
startPos : Integer;
endPos : Integer;
begin
fullCmd := GetCmdTail
// default to end of string, in case the option is the last item
endPos := Length(fullCmd);
for i := 0 to ParamCount-1 do
begin
// extract parameter name (eg, "/Option=")
currentParamName := Copy(ParamStr(i), 0, pos('=',ParamStr(i)));
// once found, we want the following item
if (startPos > 0) then
begin
endPos := pos(currentParamName,fullCmd)-2; // -1 to move back to actual end position, -1 for space
break; // exit loop
end;
if (CompareText(currentParamName, '/'+ParamName+'=') = 0) then // case-insensitive compare
begin
// found target item, so save its string position
StartPos := pos(currentParamName,fullCmd)+2+Length(ParamName);
end;
end;
if ((fullCmd[StartPos] = fullCmd[EndPos])
and ((fullCmd[StartPos] = '"') or (fullCmd[StartPos] = ''''))) then
begin
// exclude surrounding quotes
Result := Copy(fullCmd, StartPos+1, EndPos-StartPos-1);
end
else
begin
// return as-is
Result := Copy(fullCmd, StartPos, EndPos-StartPos+1);
end;
end;
您可以使用{code:ParamStrWithQuotes|abc}
调用setup.exe时,您必须转义引号,因此,可以使用以下一种方法:
setup.exe /abc="-arg ""C:\path with spaces"" -moreargs"
或
setup.exe /abc='-arg "C:\path with spaces" -moreargs'