如何向 Inno Setup 命令行编译器传入参数?

问题描述 投票:0回答:5

IS 新闻组建议使用

/D<variable>=<value>
,但使用 5.2.3 版本附带的 iscc.exe 我收到“未知选项:”错误。

那么在脚本中,如何使用命令行参数的值呢?

inno-setup
5个回答
26
投票

正如 MicSim 所说,您确实需要预处理器。它包含在最新的 ISPack 中。安装后,iscc 支持

/D

然后您可以使用这样定义的值(假设您已完成

/DVERSION_NAME=1.23
):

AppVerName=MyApplication v{#VERSION_NAME}

6
投票

来自 Inno Setup 帮助文件:

Inno 设置预处理器取代了 标准 Inno Setup 命令行 由扩展编译器(ISCC.exe) 版本。这个加长版 提供额外的参数来控制 Inno 设置预处理器。

“额外参数”包括

/d
选项。


0
投票

@Steven Dunn
的答案的要点是用另一层抽象来解决问题:不要直接从终端调用
iscc your_script.iss
,而是调用
your_script.ps1 -YourVar "value"
,处理开关,将
#define
写入
.iss 
文件,然后 然后 使用
iscc
进行编译。这没有得到很好的阐述,而且我认为显示的用于解析命令行参数的函数没有增加太多价值。不过,我会在应有的信用处给予信用。

正如

@jdigital
提到的,
ISPP
/d
开关,但是
ISPP
不能直接从终端运行(AFAIK)。因此,像
@Steven Dunn
暗示的辅助脚本方法是必要的。

您可以通过向现有

.iss
脚本添加占位符,然后相应地覆盖它们来实现此目的:

.iss
模板

; -- template.iss --

#define MyVar ""

...

.ps1
脚本

#requires -PSEdition Core

# create_iss_script.ps1

param(
    [Parameter(Mandatory=$true)][String]$MyVar,
    [Parameter(Mandatory=$true)][String]$OutFile,
)

$File = '.\template.iss'
$LineToReplace = '#define MyVar ""'
$NewLine = "#define MyVar ""${MyVar}"""

$FileContent = Get-Content -Path $File -Raw

$FileContent.Replace($LineToReplace, $NewLine) | Set-Content -Path $OutFile

终端使用示例

PS> .\create_iss_script.ps1 -MyVar "HelloWorld!" -OutFile "helloworld.iss"
PS> iscc .\helloworld.iss

或者如果您愿意,可以从

iscc
脚本中运行
.ps1
步骤。


0
投票

/D
命令行参数对我来说非常有用。如果您对语法感到困惑,我建议您调用
iscc \?
来查看帮助菜单,因为它在这里非常有用。

以下是我们创建安装程序的方法:

$ISCC = 'path/to/iscc.exe'
$ExternalDependency = 'random/path/to/external/dep'
# Make sure to quote escape /D filepath params
Start-Process -FilePath $ISCC -ArgumentList "/D""DepDir=$ExternalDependency"" VersionNo=1.1.0 ./myscript.iss""" -NoNewWindow

然后在国际空间站内,您可以像任何其他变量一样访问:

[Setup]
AppVersion={#VersionNo}

[Files]
Source: "{#DepDir}\*"; DestDir: "{app}\external\";

-1
投票

如果您想在 Inno Setup 中解析来自

[Code]
的命令行参数,请使用与此类似的方法。只需从命令行调用 inno 脚本,如下所示:

C:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue

然后你可以在任何需要的地方这样调用

GetCommandLineParam

myVariable := GetCommandLineParam('-myParam');

//================================================ ===================

{ Allows for standard command line parsing assuming a key/value organization }
function GetCommandlineParam (inParam: String):String;
var
  LoopVar : Integer;
  BreakLoop : Boolean;
begin
  { Init the variable to known values }
  LoopVar :=0;
  Result := '';
  BreakLoop := False;

  { Loop through the passed in arry to find the parameter }
  while ( (LoopVar < ParamCount) and
          (not BreakLoop) ) do
  begin
    { Determine if the looked for parameter is the next value }
    if ( (ParamStr(LoopVar) = inParam) and
         ( (LoopVar+1) < ParamCount )) then
    begin
      { Set the return result equal to the next command line parameter }
      Result := ParamStr(LoopVar+1);

      { Break the loop }
      BreakLoop := True;
    end

    { Increment the loop variable }
    LoopVar := LoopVar + 1;
  end;
end;

希望这有帮助...

© www.soinside.com 2019 - 2024. All rights reserved.