【问题标题】:Visual Studio Setup Project - Shortcuts cause installation rollbackVisual Studio 安装项目 - 快捷方式导致安装回滚
【发布时间】:2017-08-25 11:03:33
【问题描述】:

我有一个包含很多插件和配置文件的项目。现在我正在为它做一个 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。如果我离开它一切正常。

我在谷歌上搜索了一个解决方案,但找不到任何东西,有人可以帮助我吗?

【问题讨论】:

    标签: visual-studio installation setup-project


    【解决方案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。本质上是其创建背后的基本原理。

    【讨论】:

    • 这是一个自修复问题,我已经明白了。但我认为有一种方法可以告诉 Windows Installer 不要跟踪特定文件。这个项目有很多不同人开发的插件,所以我想避免每个人都不得不把手伸进安装项目。现在我知道这是不可能的,谢谢!
    • 有一种方法,但我担心它会让你误入歧途。如果您设置blank component GUID,该文件将被安装但从不跟踪或卸载 - 这将消除自我修复。似乎可以解决您的问题,但并不理想。您有时会在新安装时遇到文件覆盖问题(未安装新文件)。如果您删除 zip 文件,也不会出现此问题,但我不喜欢这种设计 - 这是不好的部署。首选选项是使用 WiX,并让每个开发人员在项目设置后添加一个简单的 XML 元素来添加他们的文件。
    【解决方案2】:

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

    详细的日志应该显示脚本失败的地方。执行 msiexec /I [msi 文件路径] /l*vx [日志文件路径]

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

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

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

    【讨论】:

    • 感谢您的回答,vbs 脚本可以正常工作,无论如何我用它更新了我的问题以澄清我的问题。看看脚本末尾的 cmets。
    • 我要再次指出,您的脚本中没有初始化 s7zLocation。
    • 我同意,但是7z.exe 可能在路径中,或者甚至可能安装到与 VBScript 相同的文件夹中,因此 s7zLocation 中的空字符串无关紧要? @simone-cifani:如果它只是在路径中,我认为它永远不会在目标系统上运行(除非 7z.exe 安装程序更新系统路径并且在每个目标系统上)。我发现解压缩一个大的部署反模式顺便说一句。
    • 您假设从 msiexec.exe 调用与作为交互式用户从资源管理器窗口双击 VBScript 相同。请参阅我添加的评论。
    • 我只是在推理,因为 OP 声称脚本运行正常。如果他在 GUI 中以立即模式运行(必须是完成对话框)或在 InstallExecuteSequence 中的 InstallFinalize 之后运行怎么办?在这种情况下,他应该有一个用户上下文。它以某种方式工作,但我确信它不是以可靠的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多