Inno Setup - 替换子安装程序生成的目录树

Posted

技术标签:

【中文标题】Inno Setup - 替换子安装程序生成的目录树【英文标题】:Inno Setup - Replace directory tree produced by subinstaller 【发布时间】:2017-05-24 21:54:25 【问题描述】:

在 Inno Setup 脚本中,我运行一个安装自定义 VB 应用程序的 VB 可执行程序(工作正常,这里没有问题)。

但是一旦完成,在 VB 安装完成后,我需要复制一些文件以覆盖由 VB 安装可执行文件创建的文件和文件夹。 这些“更新”的文件已经被 Inno Setup 放置在它们的 temp 文件夹中的 [Files] 部分中,并且它们已成功部署在该文件夹中到目标 PC。

问题是无论我尝试了什么,似乎由于某种原因FileCopy 命令被忽略了。

所以我需要的步骤如下:

// 复制必须运行的 VB 安装程序可执行文件并复制将在 VB 安装程序运行后更新 VB 安装程序的文件

[Files]
    Source: "C:\##Deploy\Titan\LABORATORY\BTLABSETUP.msi"   ; DestDir: "app\Temp"  ; Components: Laboratory ; Permissions: users-full
    Source: "C:\##Deploy\Titan\LABORATORY\BetolinkLAB\*.*"   ; DestDir: "app\Temp" ; Components: Laboratory ; Permissions: users-full ;  Flags: ignoreversion recursesubdirs 

然后我运行 VB 安装程序(运行正常)

[Run]
    Filename: "msiexec.exe"; Parameters: "/i ""app\Temp\BTLABSETUP.msi" ; AfterInstall: CopyAllFiles

在 VB 可执行文件之后,我需要立即复制并覆盖文件。

所以我现在需要的是在目标计算机上将已经复制到Temp文件夹中的文件和文件夹复制回来,以替换VB可执行文件创建的相同目录结构中的文件。

例如,从 temp\Configuration 文件夹中取出所有文件并覆盖 app\Configuration 文件夹中存在的相同文件。

这就是为什么我从一个示例中使用我发现后安装的原因:它调用CopyAllFiles,这是我的CopyAllFiles 代码

procedure CopyAllFiles;
begin

    MsgBox('About to Copy the files', mbInformation, MB_OK);

    FileCopy('app\Temp\*.*'                            , 'app\*.*'                          , False)
    FileCopy('app\Temp\Configuration\*.*'              , 'app\Configuration\*.*'            , False)
    FileCopy('app\Temp\Configuration\Korinthos\*.*'    , 'app\Configuration\Korinthos\*.*'  , False)
    FileCopy('app\Temp\Configuration\Metamorfosi\*.*'  , 'app\Configuration\Metamorfosi\*.*', False)
    FileCopy('app\Temp\Manual\*.*'                     , 'app\Manual\*.*'                   , False)
    FileCopy('app\Temp\ScriptsUpload\*.*'              , 'app\ScriptsUpload\*.*'            , False)
    FileCopy('app\Temp\Temp\*.*'                       , 'app\Temp\*.*'                     , False)
    FileCopy('app\Temp\Templates\*.*'                  , 'app\Templates\*.*'                , False)
    FileCopy('app\Temp\Temporary\*.*'                  , 'app\Temporary\*.*'                , False)
end;

Temp 源中的所有文件和文件夹都在那里,我已经检查过了,没有任何遗漏。 我也尝试过不使用通配符作为目标,也没有工作,在CurStepChanged 中尝试过,但没有更好的。

从弹出的消息框中,我知道代码在 VB 可执行文件之后进入了CopyAllFiles 过程,但什么也没发生。

任何帮助或解决方法都非常受欢迎,需要为客户准备此设置并且已经很晚并且卡住了......

谢谢 雅尼斯

【问题讨论】:

FileCopy 不支持通配符。此功能将单个文件复制到新目标。在这种情况下,您将不得不像这里Inno Setup - FileCopy use wildcard character in pathname 那样循环遍历文件夹中的文件。或者你可以把它放在[Files] 部分作为external 源加上额外的Check 或/和BeforeInstall 函数(其中BeforeInstall 可以触发安装VB)。 【参考方案1】:

FileCopy 只能复制一个文件。

要复制整个目录树,请参阅Inno Setup: copy folder, subfolders and files recursively in Code section。


尽管在您的情况下,在处理[Files] 部分之前以编程方式安装.msi 不是更合适(并且更容易实现)吗?然后让Files 部分直接将文件安装到app

在实际安装之前使用CurStepChanged event function 和ssInstall 执行代码。 使用Exec function 执行.msi

【讨论】:

以上是关于Inno Setup - 替换子安装程序生成的目录树的主要内容,如果未能解决你的问题,请参考以下文章

Inno Setup软件如何把多个安装包程序打包在一起,并一起运行呢?我看你的问题你会了吧,谢谢

更改 Inno Setup 卸载程序的默认名称以避免命名冲突

程序打包(安装包制作,Inno setup打包教程,QT程序打包)

程序打包(安装包制作,Inno setup打包教程,QT程序打包)

程序打包(安装包制作,Inno setup打包教程,QT程序打包)

Inno setup 默认安装路径的问题