如何将带有值的命令行参数传递给 Inno Setup 编译器,以便我可以在代码中使用它们?

JCo*_*ine 6 parameters command-line inno-setup

我有两种可能的构建选项。由于我不希望我的客户使用某些参数启动安装程序,因此我最好将它们传递给编译器并在我的代码中完成所有工作。

假设我有一个变量UNION,它可能有两个值:01。我必须在代码中分析该变量的值,并根据结果包含或不包含某些文件。我知道如何将参数传递给安装程序本身,但如何将它们传递给编译器?

这是一些代码:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Code: Integer;
begin
  if CurStep = ssDone then
    begin
      if not IsUnion then
        begin
          DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.UKR');
          DeleteFile(ExpandConstant('{app}')+'\Locale\C4Union.ENU');  
        end;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

IsUnion该函数应该分析从命令行获取的参数,然后根据结果完成其工作。

Mar*_*ryl 7

编译器(或技术上的预处理器)具有/D命令行开关,您可以使用它来设置预处理器变量。

例如这个...

ISCC.exe Example1.iss /DBinaryName=MyProg.exe
Run Code Online (Sandbox Code Playgroud)

...具有相同的效果,就好像您在脚本本身中使用#define指令一样,如下所示:

#define BinaryName "MyProg.exe"
Run Code Online (Sandbox Code Playgroud)

所以你可以在脚本中以同样的方式使用它:

[Files]
Source: "{#BinaryName}"; DestDir: "{app}"
Run Code Online (Sandbox Code Playgroud)

即使在以下情况下,您也可以使用变量:

ISCC.exe Example1.iss /DMode=Install
Run Code Online (Sandbox Code Playgroud)
#if Mode == "Install"
[Files]
Source: "MyProg.exe"; DestDir: "{app}"
#elif Mode == "Delete"
[InstallDelete]
Type: files; Name: "{app}\MyProg.exe"
#else
#error Unknown mode
#endif
Run Code Online (Sandbox Code Playgroud)

尽管为了达到相同的效果,您可以仅使用变量存在,例如:

ISCC.exe Example1.iss /DInstall /DDelete
Run Code Online (Sandbox Code Playgroud)
#ifdef Install
[Files]
Source: "MyProg.exe"; DestDir: "{app}"
#endif

#ifdef Delete
[InstallDelete]
Type: files; Name: "{app}\MyProg.exe"
#endif
Run Code Online (Sandbox Code Playgroud)

这些问题也涵盖了这一点:


您可以在任何地方使用预处理器指令,甚至可以在该[Code]部分中使用。

ISCC.exe Example1.iss /DBinaryName=MyProg.exe
Run Code Online (Sandbox Code Playgroud)

甚至:

#define BinaryName "MyProg.exe"
Run Code Online (Sandbox Code Playgroud)

预处理器并不关心,它作为第一步启动并将文件视为.iss纯文本文件。与C/C++ 预处理器非常相似。它不太关心部分或代码结构。您甚至可以执行以下操作:

DeleteFile(
  ExpandConstant(
    #ifdef DeleteFromUserData
    '{userappdata}\MyProg'
    #else
    '{app}'
    #endif
    )+'\Locale\C4Union.UKR');
Run Code Online (Sandbox Code Playgroud)

添加SaveToFile到脚本末尾以查看生成的代码。