Visual Studio安装项目 - 快捷方式导致安装回滚

时间:2017-08-25 11:03:33

标签: visual-studio installation setup-project

我有一个包含大量插件和配置文件的项目。现在我正在为它做一个Visual Studio安装项目。
我不想手动将每个配置文件添加到安装项目中,所以我想这样做:

  • 创建一个空的zip文件,比如config.zip,并将其添加到安装项目
  • 添加预构建操作以将所有配置文件压缩到config.zip
  • 添加一个自定义操作,该操作运行vbs脚本,将config.zip解压缩到正确的文件夹并删除它。

vbs脚本如下:

sArchiveName = "Config.zip"
sLocation = "C:\Data\Configurations"

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("Wscript.Shell")

oShell.Run """" & s7zLocation & "7z.exe"" x " & sLocation & "\" & sArchiveName & " -aoa -o" & sLocation, 1, True

'--- If I uncomment the following 2 lines, 
'--- as I click on the shortcuts the installation rollbacks.
'--- If I leave them the shortcuts work fine. 
'Set f = oFSO.GetFile(sLocation & "\" & sArchiveName)
'f.Delete True

我的问题是我在程序菜单中添加的快捷方式会导致安装回滚。原因是在安装过程结束时删除了config.zip。如果我离开它一切正常。

我已经google了解决方案,但找不到任何东西,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

这似乎是一个自我修复问题

  • 自我修复是一项核心Windows Installer功能,可以通过" advertised shortcut"来检查您的软件是否已正确安装。 (本质上是一种特殊类型的快捷方式,指向Windows Installer功能而不是直接指向文件 - 请参阅提供的链接中的更多信息。)
  • Windows Installer会跟踪您的zip文件并发现它已丢失,因此可以正确触发您的安装修复。
  • 没有很好的解决方法,因为您的部署设计不健全。 MSI专门设计为以这种方式运行,你不能禁用这个"自我修复"特征。安装zip文件后,将对其进行跟踪。
  • 如果你真的想要了解自我修复,这里有一个很长的答案,但如果没有事先了解它是什么以及它是如何工作的,它通常太详细而无法理解。仍然添加参考链接:How can I determine what causes repeated Windows Installer self-repair?
  • 处理此问题的最简单方法是通过MSI文件正确安装配置文件,然后删除整个zip文件。这些配置文件会在安装后更新,还是会被视为只读?
  • Visual Studio安装项目非常基础。这些天推荐的创建MSI文件的方法是使用WiX工具包。这是一个用于创建MSI文件(Windows Installer文件)的新框架,它允许您将安装创建为XML文件,然后将其编译为MSI二进制文件。这是一个非常优雅的工具包,但有一个学习曲线。
  • 或许请查看此答案,了解有关WiX的更多背景信息:Wix generate single component id for entire tree。如果您下载并安装WiX工具包和Visual Studio插件,您将获得允许创建WiX XML包文件的新项目类型。
  • 以下是关于WiX"的起源的答案:Windows Installer and the creation of WiX。从本质上讲,它的创建背后的基本原理。

答案 1 :(得分:0)

这些症状几乎肯定意味着您的自定义操作失败,因此安装将回滚。您需要发布您的VBScript以供我们查看。

详细日志应显示脚本失败的位置。做一个msiexec / I [msi文件的路径] / l * vx [日志文件的路径]

VBScript自定义操作中的一个常见问题是使用WScript对象,例如WScript.CreateObject。这将失败,因为在WSH环境中运行时提供了WScript对象,但在Windows Installer的调用期间不会发生这种情况。

在您发布的脚本中,s7zLocation似乎未初始化。

另请注意,代码是从msixec.exe调用的,与系统帐户一起运行,并且没有任何基础结构,如果您是从交互式用户资源管理器环境(例如工作目录)运行的话。您需要指定所有可执行文件和正在使用的文件的完整路径。