Inno setup 为每个文件调用Inno Setup AfterInstall函数

Inno setup 为每个文件调用Inno Setup AfterInstall函数,inno-setup,pascalscript,Inno Setup,Pascalscript,我想在安装文件夹后调用函数,但是InstallEnv函数似乎被调用了几次,可能每个文件都是文件夹(待确认)。有没有办法在安装了所有这些文件后只调用一次?我无法使用Run部分,因为我想用返回代码执行错误捕获 Source: "InputFiles\virtualenv-1.8.2\*"; DestDir: "{tmp}/virtualenv"; \ Flags: recursesubdirs; AfterInstall: InstallEnv; 是的,每个文件执行一次。关于这件事(我强

我想在安装文件夹后调用函数,但是
InstallEnv
函数似乎被调用了几次,可能每个文件都是文件夹(待确认)。有没有办法在安装了所有这些文件后只调用一次?我无法使用
Run
部分,因为我想用返回代码执行错误捕获

Source: "InputFiles\virtualenv-1.8.2\*"; DestDir: "{tmp}/virtualenv"; \
    Flags: recursesubdirs; AfterInstall: InstallEnv; 

是的,每个文件执行一次。关于这件事(我强调):

[文件]部分条目的安装前或安装后功能 使用通配符会对匹配通配符的每个文件调用一次。使用 CurrentFileName以检查调用函数的文件

不,在安装完所有文件后,无法调用它一次。如果只运行一次,这不会是一个问题,因为您可能会声明一个标志变量,指示该函数已被调用,但您希望检测它是否是最后一次调用,因此没有解决方法


好的,如果您知道哪个文件是该文件夹中最新安装的,您可以根据函数调用的结果进行检查,但我怀疑您能否确定在编译时最后安装哪个文件(因为在运行时,目前无法获取要安装的文件列表).

在该组文件安装结束时,无法从单个条目中调用它。但是,可以通过使用虚拟条目在适当的时间调用函数:

[Files]
Source: "InputFiles\virtualenv-1.8.2\*"; DestDir: "{tmp}\virtualenv"; Flags: recursesubdirs
Source: dummy.txt; DestDir: {tmp}; AfterInstall: InstallEnv
源文件必须存在,但可以是零字节文件。由于安装是在
{tmp}
中进行的,所以在安装之后它将被删除,因此它的内容是无关的


这是因为
[Files]
条目是按指定的顺序安装的。

看看你的两个问题,当
CurStep
参数为
ssPostInstall
时,你不想在event方法中执行你需要的操作吗?事实上,我在周一就尝试过了,但是,当执行返回的代码不同于零时,我希望使安装失败(或中止安装)。但是,代码
WizardForm.Close
ssPostInstall
上不起作用(可能是因为它在实际安装之后)。我明白了。您正在寻找一种方法,如果
InstallEnv
过程中出现问题,如何中止安装过程(并回滚更改)。好吧,我不会依赖上次安装的文件的名称,因为它让我感觉不可预测。另一个选项可能是在安装前为下一个安装的
[文件]
条目编写
过程。或者为
InstallEnv
过程创建一个通过计数器,并由预处理器确定文件总数。无论何时调用该过程,您都会递增该计数器,如果它达到该常量值,则它是最后一个文件。无论如何,您真的需要在安装所有文件后调用该过程吗。您不能修改它以便它只处理当前安装的文件吗?我无法想象你需要对所有已安装的文件做些什么,而这些文件不可能对每个文件进行增量处理。我最终使用了
CurStep
,并选中如果返回代码大于0,则不执行其他命令。如果出现错误,我还会显示一个消息框并将输出记录在一个文件中。