IS 新闻组建议使用
/D<variable>=<value>
,但使用 5.2.3 版本附带的 iscc.exe 我收到“未知选项:”错误。
那么在脚本中,如何使用命令行参数的值呢?
正如 MicSim 所说,您确实需要预处理器。它包含在最新的 ISPack 中。安装后,iscc 支持
/D
。
然后您可以使用这样定义的值(假设您已完成
/DVERSION_NAME=1.23
):
AppVerName=MyApplication v{#VERSION_NAME}
来自 Inno Setup 帮助文件:
Inno 设置预处理器取代了 标准 Inno Setup 命令行 由扩展编译器(ISCC.exe) 版本。这个加长版 提供额外的参数来控制 Inno 设置预处理器。
“额外参数”包括
/d
选项。
@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
步骤。
/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\";
如果您想在 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;
希望这有帮助...