13

我正在尝试从一组示例程序中自动执行一组 MSI 文件(由 WiX 生成)的往返安装和卸载。出于某种原因,一个非常乐意通过双击安装的 .MSI 文件会生成:

无法打开此安装包。验证该包是否存在并且您可以访问它,或者联系应用程序供应商以验证这是一个有效的 Windows Installer 包。

当我以下列方式使用 MSIEXEC 调用它时:

<ItemGroup>
  <_SampleMsi Include="$(_ArtifactsPathAcceptanceSamples)\**\*.msi" />
</ItemGroup>
<Exec Command="$(WixDir)\smoke &quot;%(_SampleMsi.Identity)&quot;"/>
<!--Guarantee precondition even if cleanup didn't work-->
<Exec Command="msiexec -passive -norestart -x &quot;%(_SampleMsi.Identity)&quot;" IgnoreExitCode="true"  />
<Exec Command="msiexec -norestart -i &quot;%(_SampleMsi.Identity)&quot;"  />
<!--Uninstall of every sample should also always work-->
<Exec Command="msiexec -passive -norestart -x &quot;%(_SampleMsi.Identity)&quot;" />

当我尝试根据产品 ID GUID 卸载时,也会发生同样的问题:-

msiexec -passive -norestart -x FC7445BB-7E1D-4E36-A42A-CFA56263E453

是什么赋予了?

4

2 回答 2

21

刚刚删除.\了文件名的前缀并且它起作用了。

于 2019-05-09T12:17:05.897 回答
12
  1. 不要从字面上理解消息的文本。您应该得出的所有结论是 misexec 将您的命令的某些部分视为文件名,并且它没有加载和处理它的全部内容以使其满意。无论是因为路径太长,权限被拒绝,还是其他任何仅受您想象限制的条件(大多数知识库文章似乎都与安装程序缓存问题有关,这通常是基于 GUID 的语法或修补/升级选项)

  2. 你错过了 GUID 中的大括号,傻瓜。我的意思是你确实知道 GUID 上有大括号,即使msiexec /?没有告诉你或给你看?!

    即你需要替换FC7445BB-7E1D-4E36-A42A-CFA56263E453{FC7445BB-7E1D-4E36-A42A-CFA56263E453}

    (我已经停止信任/读取输出,并且正在考虑 GUID 解析为 msiexec 不满意的缓存 MSI 的可能性,原因与它似乎对所有 KB 文章的安装语法不满意相同在这个空间倾向于谈论。)

  3. 您的路径包含相对跳转,尽管净长度 <160 个字符,但总长度 >160 个字符,因此底层文件 API 令人窒息。人们喜欢编写具有误导性的通用错误消息。

    您可以通过在使用的每个批处理表达式中替换Identity上面的来修复它。FullPath

    另一种补救方法是使用 a WorkingDirectorywith the Execofmsiexec

于 2012-04-11T15:04:44.030 回答