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

时间:2018-04-24 14:57:47

标签: inno-setup

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

例如,-arg "C:\path with spaces" -moreargsParameters部分条目中[Run]应该用作setup.exe /abc="-arg "C:\path with spaces" -moreargs" 时,我想像这样启动安装程序:

[Code]

通过ParamStr()输出安装程序在/abc=-arg C:\path部分中收到的参数,显示它们(当然)分开:withspaces -moreargssetup.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$" 中保留的内部引号然后替换它们随后报价。但如果有办法使用内置函数,我宁愿不这样做。

1 个答案:

答案 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'