我正在尝试从一组示例程序中自动执行一组 MSI 文件(由 WiX 生成)的往返安装和卸载。由于某种原因,双击后会生成一个非常适合安装的 .MSI 文件:
此安装包无法打开。验证该包是否存在并且您可以访问它,或者联系应用程序供应商以验证这是一个有效的 Windows Installer 包。
当我按以下方式使用 MSIEXEC 调用它时:
<ItemGroup>
<_SampleMsi Include="$(_ArtifactsPathAcceptanceSamples)\**\*.msi" />
</ItemGroup>
<Exec Command="$(WixDir)\smoke "%(_SampleMsi.Identity)""/>
<!--Guarantee precondition even if cleanup didn't work-->
<Exec Command="msiexec -passive -norestart -x "%(_SampleMsi.Identity)"" IgnoreExitCode="true" />
<Exec Command="msiexec -norestart -i "%(_SampleMsi.Identity)"" />
<!--Uninstall of every sample should also always work-->
<Exec Command="msiexec -passive -norestart -x "%(_SampleMsi.Identity)"" />
当我尝试根据产品 ID GUID 进行卸载时,也会发生同样的问题:-
msiexec -passive -norestart -x FC7445BB-7E1D-4E36-A42A-CFA56263E453
什么给予?
刚刚删除了
.\
在文件名前面,它就起作用了。
请勿按字面理解消息文本。您应该得出的结论是,misexec 将命令的某些部分视为文件名,并且它没有加载和处理整个命令以满足其要求。无论是因为路径太长、权限被拒绝,还是仅受您想象力限制的任何其他条件(大多数知识库文章似乎与安装程序缓存问题有关,这通常是基于 GUID 的语法或修补/升级)选项)
你缺少 GUID 中的大括号,傻瓜。我的意思是,即使
msiexec /?
没有告诉你或向你展示,你也知道 GUID 上有大括号,对吗?!
即您需要将
FC7445BB-7E1D-4E36-A42A-CFA56263E453
替换为 {FC7445BB-7E1D-4E36-A42A-CFA56263E453}
(我已经停止信任/读取输出,并考虑 GUID 解析为缓存的 MSI 的可能性,而 msiexec 对此不满意,原因与它似乎对安装语法不满意(所有 KB 的内容一样)这个空间的文章往往会谈论。)
您的路径包含相对跳转,尽管净长度为 <160 chars, have a gross length >160 个字符,因此底层文件 API 令人窒息。人们喜欢编写具有误导性的通用错误消息。
您可以通过在使用的每个批处理表达式中将上面的
Identity
替换为 FullPath
来修复此问题。
另一种补救方法是 使用
WorkingDirectory
与 Exec
的 msiexec