7zip 自解压存档 (SFX) 和 .Net 安装程序

Posted

技术标签:

【中文标题】7zip 自解压存档 (SFX) 和 .Net 安装程序【英文标题】:7zip Self Extracting Archive (SFX) and .Net Installer 【发布时间】:2012-07-12 19:46:27 【问题描述】:

我正在尝试为我编写的 Windows 应用程序创建一个自解压存档。我的应用程序使用最新的 .Net 4.0,我想在 SFX 安装程序中包含 .Net 设置。但是,如果计算机需要安装 .Net 框架并重新启动,它将无法正确恢复安装我的应用程序。我查看了 Stack 网站上的其他 sfx 帖子,但没有一个问题涉及将 .Net 安装程序作为应用程序的先决条件。

我的项目产生 4 个文件:“App Installer.msi”“setup.exe”“WindowsInstaller-KB893803-v2-x86.exe”(在文件夹“WindowsInstaller3_1”中)和“dotNetFx40_Client_x86_x64.exe”(在文件夹“ DotNetFX40Client"),我认为所有这些都是标准的。

我使用 7zip 创建 SFX 如下:

首先,使用 7zip 将所有文件压缩成一个存档:

7z.exe a -r AppInstallFiles.7z *

接下来,我使用 7zS.sfx 文件(用于创建自解压安装程序)、我的配置文件和存档进行二进制复制。配置文件如下:

;!@Install@!UTF-8!
Title="MyApp Installer"
ExecuteFile="setup.exe"
;!@InstallEnd@!

然后我将它们复制到以下行:

copy /b 7zS.sfx + config.txt + AppInstallFiles.7z MyAppInstaller.exe

安装程序可以在已经安装了 .Net 4.0 的计算机上完美运行 我的问题出现在没有 .Net Framework 的计算机上 - 我运行 SFX,它将所有内容提取到临时目录中。然后,当 setup.exe 识别出计算机没有 .Net 4.0 时,它会调用 .Net 安装程序。这将提取到它自己的临时目录并开始安装。完成后,它会提示重新启动。点击“否”退出整个安装。点击“是”重新启动机器,重新登录时出现错误:“尝试安装 MyApp 时发生错误”,详细信息为“无法找到应用程序文件 'App Installer.msi'

问题似乎是,当安装程序移交给 .Net 安装程序并且 .Net 安装程序重新启动时,包含 My App 安装文件的临时目录被删除。我曾尝试从 setup.exe 切换到使用“App Installer.msi”,但这只会导致 msi 报告计算机没有 .Net 并建议进行 Web 下载。由于我可能在离线情况下安装应用程序,这对我不起作用。

之前有没有其他人尝试在 7zip SFX 中包含 .Net 安装程序,如果是,他们是如何解决的?如果可能,我更愿意继续使用 7zip,但如有必要,我会研究其他工具。

【问题讨论】:

因此,作为临时解决方案,我创建了一个批处理脚本,它使用 /norestart 标志调用两个更新(WindowsInstaller 和 dotNetFx40_Client_x86_x64)。这并不理想,因为 a) 如果已安装,此方法不会自动跳过 .Net 安装程序步骤,并且 b) 在使用应用程序之前,我无法传递消息通知用户重新启动。它还会创建一个 cmd 窗口,最好避免使用它。 【参考方案1】:

问题是自解压会在 setup.exe 完成后删除提取的文件。为避免这种情况,您可以使用InstallPath 参数:

;!@Install@!UTF-8!
Title="MyApp Installer"
ExecuteFile="setup.exe"
InstallPath="%temp%\\My App"
;!@InstallEnd@!

但在这种情况下,提取的文件根本不会被删除。例如,您可以在 MSI 中删除这些文件。

PS。如果您的客户将通过远程桌面会话运行安装程序,您还可以考虑 this issue

【讨论】:

实际上,7zip 9.20 没有这个标志,虽然我在多个地方看到过它(参见sourceforge.net/projects/sevenzip/forums/forum/45798/topic/… - 来自创建者,“7-Zip SFX 不支持”InstallPath “变量”,从文档中,唯一的参数是 Title、BeginPrompt、Progress、RunProgram、Directory、ExecuteFile 和 ExecuteParameters。不过我最终做了类似的事情 - 请参阅下面的答案。 另外,感谢您对远程桌面问题的提醒,但这对我来说不是问题。似乎我也可以提取到程序文件中的应用程序(假定)目录以避免它。但是,这可能会让在其他地方安装应用程序并且不希望 %programfiles%\MYAPP 文件夹存在的用户感到恼火。 我们使用来自 7zsfx.info/en 的修改后的 7zip SFX。它支持 InstallPath 和许多其他参数。 @Serghei 的链接更改日志显示该软件包的最后一次编辑是 2007 年。【参考方案2】:

我确定了一个我认为可以接受的解决方案。由于问题是由于 sfx 临时文件夹在重新启动时自行删除,因此我运行批处理文件而不是 setup.exe。批处理文件将 temp 目录中的所有内容复制到 temp 中的新目录,并从那里调用 setup:

::install.cmd, used to move the setup files to another directory before executing
xcopy /s * ..\MY_APP\
::use start to hide the cmd window
start ..\MY_APP\setup.exe

此文件夹会在重新启动时继续存在,从而允许继续安装。正如 serghei 所说,这在技术上是一个问题,因为它会持续到用户手动删除临时文件,但考虑到我的应用程序与现代硬盘相比的大小,这是可以接受的

【讨论】:

以上是关于7zip 自解压存档 (SFX) 和 .Net 安装程序的主要内容,如果未能解决你的问题,请参考以下文章

7zip 命令行自解压器不要求路径

7-zip SFX 配置问题 [关闭]

7zip 中的 7z.sfx 和 7zsd.sfx 模块有啥区别?

命令行创建两个文件夹的 7z 存档和一个文件以自解压到指定位置

如何自动构建此 Winrar Sfx 文件

如何在 Windows 批处理文件中使用 7zip 从 ZIP 存档中提取最后一个目录?