gpt4 book ai didi

inno-setup - 将包含引号的命令行参数传递给安装程序

转载 作者:行者123 更新时间:2023-12-05 07:34:43 25 4
gpt4 key购买 nike

我正在尝试将自定义命令行参数传递给使用 Inno Setup 创建的安装程序。参数值实际上由几个参数组成,这些参数将在安装完成时用于启动已安装的程序,因此该值包含空格和引号以将参数组合在一起。

例如,当 -arg "C:\path with spaces"-moreargs 应该用作 [Run] 中的 Parameters 时部分条目,我想像这样启动安装程序:

setup.exe /abc="-arg "C:\path with spaces" -moreargs"

安装程序通过 ParamStr()[Code] 部分中接收的参数输出显示它们(当然)分开:/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() 中保留的内部引号 然后用引号替换它们。但如果有办法使用内置函数,我宁愿不这样做。

最佳答案

{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'

关于inno-setup - 将包含引号的命令行参数传递给安装程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com