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程序打包)