2017-08-25 98 views
0

我有一个项目有很多插件和配置文件。现在我正在为它做一个Visual Studio安装项目。
我不想手动添加每个配置文件到安装项目,所以我想这样做:Visual Studio安装项目 - 快捷方式导致安装回滚

  • 创建一个空的压缩文件,说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。如果我离开它一切正常。

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

回答

1

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

  • 自我修复是一个核心的Windows安装程序功能,它会检查你的软件安装正确,只要你通过“advertised shortcut”(本质上是一种特殊类型的快捷方式,指向Windows安装程序的功能,而不是直接将其启动一个文件 - 在提供的链接中查看更多信息)。
  • Windows安装程序跟踪您的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。实质上是其创作背后的基本原理。
+0

这是一个自我修复的问题,我已经明白了。但我认为有一种方法可以告诉Windows Installer不要跟踪特定的文件。该项目有很多由不同人开发的插件,所以我想避免每个人都必须把他的手放到设置项目中。现在我知道这是不可能的,谢谢! –

+1

有一种方法,但我担心它会导致你误入歧途。如果你设置了一个“空白组件GUID”,该文件将被安装,但从未跟踪或卸载 - 这将消除自我修复。看起来像解决您的问题,但它并不理想。您有时在新安装时遇到文件覆盖问题(未安装新文件)。如果你删除了zip文件,这个问题也不应该发生,但我不喜欢这种设计 - 这是不好的部署。首选的方法是使用WiX,并在项目设置完成后让每个开发人员添加一个简单的XML元素来添加他们的文件。 –

0

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

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

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

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

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

+0

感谢您的回答,vbs脚本完成它的工作,无论如何我更新了我的问题,以澄清我的问题。看看脚本末尾的评论。 –

+0

我会再次指出s7zLocation未在您的脚本中初始化。 – PhilDW

+0

我同意,但也许'7z.exe'是在路径中,或者甚至可以安装到与VBScript相同的文件夹,以便's7zLocation'中的空字符串不重要? @ simone-cifani:如果它只是在路径中,它将永远不会在目标系统上工作,我会假设(除非7z.exe安装程序更新系统路径并且位于每个目标系统上)。我发现解压缩一个大的部署反模式顺便说一句。 –

相关问题