Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix/MSI:无法卸载_Wix_Windows Installer_Uninstallation - Fatal编程技术网

Wix/MSI:无法卸载

Wix/MSI:无法卸载,wix,windows-installer,uninstallation,Wix,Windows Installer,Uninstallation,我为一个内部项目开发了一个Wix安装程序,但完全是出于偶然,我发现我无法在我的开发机器上卸载安装程序,因为我收到以下错误消息: 您尝试使用的功能位于不可用的网络资源上 有一个对话框指向我从功能安装的.msi的路径。(虽然.msi在那里,但它已重建,因此在我安装它后发生了更改) 我担心这个对话框,因为我相信Windows Installer会跟踪已安装的.MSI文件,但是这个对话框似乎暗示我可以通过删除、移动或更改安装程序来破坏我的卸载程序 是这样吗 我需要做什么来确保我不会以这种方式破坏我的卸载

我为一个内部项目开发了一个Wix安装程序,但完全是出于偶然,我发现我无法在我的开发机器上卸载安装程序,因为我收到以下错误消息:

您尝试使用的功能位于不可用的网络资源上

有一个对话框指向我从功能安装的.msi的路径。(虽然.msi在那里,但它已重建,因此在我安装它后发生了更改)

我担心这个对话框,因为我相信Windows Installer会跟踪已安装的.MSI文件,但是这个对话框似乎暗示我可以通过删除、移动或更改安装程序来破坏我的卸载程序

是这样吗


我需要做什么来确保我不会以这种方式破坏我的卸载程序?(我们是否需要保留安装程序在计算机上安装过的所有版本的副本?

编写安装程序的第一个痛苦教训是永远不要在自己的机器上运行安装程序。当然,直到它达到成熟点并经历了几个QA周期。这就是我们拥有集成实验室和虚拟机的目的。(有一种说法是关于你不应该在自己后院做的事情。)

也就是说,通常MSI卸载不需要MSI,但在某些情况下可能需要它。例如,如果要在卸载期间调用ResolveSource操作,MSI将查找.MSI

现在有几种方法可以解决这个问题:

  • 拿一个你们拥有的MSI,用ORCA编辑它,使之和你们安装的MSI的文件名、升级代码、产品代码和包代码相匹配。通过查看
    %WINDIR%\Installer
    中存在的剥离缓存MSI,您应该能够获得所有这些信息。CD到该目录,然后执行
    findstr-i-m SOMESTRING*.msi
    操作,其中SOMESTRING是与您的ProductName属性类似的唯一属性。知道缓存的MSI的名称后,在Orca中打开它以获取所需的属性。然后将这些属性放在可用的MSI副本中,并尝试执行卸载。不,它不是您安装的确切MSI,但通常距离足够近
  • 使用前端windows installer清理实用程序(如果您还有)和/或后端
    MSIZAP
    实用程序从MSI和添加/删除程序中删除应用程序的所有知识。注意,这实际上并不卸载程序,因此您还必须编写脚本或手动卸载程序的所有跟踪
  • 重新映像您的工作站

  • 摆脱这种情况的最简单方法是重新安装。构建一个没有“坏掉”的MSI新版本(不管它以何种方式坏掉,在这种情况下,它可能根本就没有坏掉,你只需要一个新的源代码)。然后使用如下命令行:

    msiexec /fv path\to\your.msi /l*v i.txt
    

    这将在缓存的msi上复制您的.msi并进行修复。然后你会在一个更好的地方。

    如果你确切地知道什么是错误的(开发过程中经常会出现这种情况),我更喜欢打开MSI文件,Windows将使用该文件进行卸载,并直接使用Orca之类的工具对其进行编辑,以修复或删除导致故障的部分

    例如:

    • 在%WINDIR%\Installer中找到MSI文件。MSI应该是卸载失败后该文件夹中最后一个编辑的MSI文件
    • 用Orca打开msi文件
    • 删除失败的部分-例如失败的InstallExecuteSequence操作,这是一种非典型场景
    • 保存msi并关闭Orca以释放msi文件上的锁

    1-您在安装过程中是否尝试过“从源运行”

    这是功能树中的一个选项,允许您从安装源运行某些文件。这通常与网络上的管理员映像相结合。见下图。我还没有尝试过,但我认为如果网络关闭,并且您正在尝试卸载,可能会导致:“您尝试使用的功能位于不可用的网络资源上”。这只是一个理论,还有其他方法可以实现

    2-是否正在运行脚本自定义操作?如果是,您是提取到tmp文件夹还是从已安装的文件或二进制表运行?如果是,自定义操作是否仅在安装时运行

    3-您是否正在运行指向已安装文件的EXE自定义操作?如果是这样,网络上可能无法访问此文件

    4-您的用户档案文件夹是否已重定向到网络共享

    5-您是否直接将任何内容安装到网络上的文件夹中


    还有很多其他的可能性。

    我的问题是-如何阻止这种情况在生产机器上发生,我知道如何修复我的机器!:-)“我们需要保留机器上安装过的所有安装程序版本的副本吗?”嗯,是的。你不是已经保留了所有投入生产的东西的副本吗?我知道我们有一个配置管理系统,确保我们做到了这一点,无论它在哪里交付。如果您的问题是为什么会发生这种情况,而不是如何摆脱它,那么请记录卸载以了解它为什么要求MSI。我的问题是-如何在生产机器上阻止这种情况发生,(或者我的MSI如何“损坏”),我知道如何修复我的机器!:-)查看详细日志文件,找出需要原始源代码的原因。您的MSI中可能有一个bug,它迫使您在卸载过程中需要原始源代码。在你修复之前,你需要有MSI可用。。。这非常令人讨厌。:)