JCo*_*ine 6 parameters command-line inno-setup
我有两种可能的构建选项。由于我不希望我的客户使用某些参数启动安装程序,因此我最好将它们传递给编译器并在我的代码中完成所有工作。
假设我有一个变量UNION,它可能有两个值:0和1。我必须在代码中分析该变量的值,并根据结果包含或不包含某些文件。我知道如何将参数传递给安装程序本身,但如何将它们传递给编译器?
这是一些代码:
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该函数应该分析从命令行获取的参数,然后根据结果完成其工作。
编译器(或技术上的预处理器)具有/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到脚本末尾以查看生成的代码。
| 归档时间: |
|
| 查看次数: |
2232 次 |
| 最近记录: |