按顺序卸载补丁时 Windows Installer 出现“错误 1308。未找到源文件”场景

2024-01-29

我需要使用 Patch Design 和 Installshield 2012 创建的一系列可卸载补丁。前两个补丁在卸载时工作正常。但是,当且仅当已应用补丁 1 和/或补丁 2 时卸载第三个补丁时,才会产生错误:

MSI (c) (48:C4) [19:02:54:135]: Font created.  Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg
Error 1308.Source file not found: {pathToFile}.  Verify that the file exists and that you can access it.

其中有 26 个与不同文件有关的错误。文件或组件没有明显的模式,或者有特征

注意:如果我只应用了补丁 3,卸载不会产生此错误。

我在“补丁设计”中使用相同的选项创建了所有三个补丁。据我所知,唯一明显的区别是补丁 3 包含比前两个补丁更多的更改(文件更新)。让我再说一遍:还有更多变化。

我的问题是:

  1. 为什么只有安装了该系列补丁的情况下才会出现这种情况,而不是仅安装第三个补丁本身?

  2. 为了防止补丁卸载尝试从构建补丁时仅用于设计时的位置获取文件,我需要做什么?或者也许这是设计使然的,但是缓存太过载或混乱......?

更新 - 更多信息(Glytzhkof 要求): 该补丁包含 96 个文件更改,大约是基本 MSI 包大小的一半。它实际上是“开发”分支的工作。添加了几个新文件。有些最初被删除(当我发现我们真的在做补丁时不得不将它们放回去......)。如果我再描述这种情况,可能会冒犯作为该领域专业人士的您。

我一直在尝试出售主要升级版,只需对安装程序进行一些调整即可使其不再需要补丁。我们的产品的卸载需要参数才能使其成为非交互式(我们需要此参数才能在主要升级场景中工作,它目前只是卸载序列的一部分)。这是唯一真正的问题——但解决这个问题肯定会付出巨大的代价。然而,我们决定不解决这个问题。我尝试在每次迭代中“解决”这个问题。没有骰子。我被告知我们需要针对主要版本的补丁 - 所以在这里我试图让尾巴摇狗。

是的,补丁可以更快(让我在这里唱反调)。但实际上,当这些东西自动部署时,30 秒和 90 秒之间有什么区别?是的,我也考虑过寻找优化安装程序的方法,通过调整文件成本来看看它是否能让安装速度更快,但即便如此,我确信还会有另一个原因要求提供补丁。

另一个更新:1308 错误中提到的文件不在目标系统上%windir%Installer\$PatchCache$\Managed\{PackedProductCodeOfMyBaseMSI??}

文件夹。这可能会导致 1308,因为如果我从此缓存中删除更多文件,我会收到与丢失文件对应的相同错误。问题可能是,为什么不是所有文件都在这个中补丁缓存 http://blogs.msdn.com/b/heaths/archive/2007/01/17/the-patch-cache-and-freeing-space.aspx folder?


我仍在寻找解决方案或至少一些指导,甚至 尽管我同意这不符合正常的良好做法。 – j杰克 1小时前

我无法访问我的部署工具,但我会尝试提供一个视角。由于我没有完全掌握您所写内容的所有方面,因此这将是一般性评论。我希望它至少与你所问的问题有关。正如我所写,它变成了博客。

对我来说MSI补丁有效于2 基本场景:

  1. You 修复卸载顺序中的错误带有次要升级补丁的已安装产品。
  2. 您为几个文件提供了一个小升级补丁作为“hotfix“对于已发布的产品,重新安装可能会非常庞大​​且耗时。

为了这两个目的,我多次有效地专业地使用了 MSI 补丁。在每种情况下都没有其他好的解决办法。恕我直言,修补是为了“修补”——这是整个技术的设计目的,而不是为了部署频繁的增量更新。提供 96 个文件更新NOT热修复。

补丁是有效的升级:请记住,修补只是一种更紧凑的交付机制,用于已经有效的升级。它可以是重大更新、次要更新,甚至是小更新,每一项的工作方式都不同。在执行任何其他操作之前,请确保在尝试将其打包为补丁之前测试实际的完整升级 MSI。这是我能给你的最好建议。如果完整升级无法正常工作,则所有花在修补上的努力都会被浪费。是的,这包括在制作补丁之前的所有交互中的安装、卸载和升级。这可能是最常见的修补错误。

存在一些阻碍补丁卸载的障碍. 有数十个技术问题可能导致补丁无法卸载 http://msdn.microsoft.com/en-us/library/aa372102(v=vs.85).aspx(推荐阅读)。这有时是一个大问题,因为部署了修补程序的补丁可能会被发现有缺陷,因此应该完全撤回。在我看来,这是一个小补丁的核心用途之一 - 部署一个可以回滚的快速修复。

修补和自定义操作条件:对我来说,修补最糟糕的方面之一是,包中的自定义操作可能无法正确调节,以便在执行修补操作(而不是正常安装)时不运行。补丁功能补丁特定的属性例如PATCH and MSI补丁删除。在自定义操作上使用这些条件,使它们在修补程序期间运行或不运行,具体取决于必要的情况。请注意自定义操作的条件,正确执行它们很复杂。这里有一个"MSI 条件备忘单 http://www.flexerasoftware.jp/webdocuments/PDF/IS-CHS-Common-MSI-Conditions.pdf"来帮你。我没有测试过这些条件——测试是唯​​一的保证。

还有一些修补建议:

  • 我会完全忘记主要的升级补丁。我已经尝试过,并将再次尝试,但它们往往不太理想。一个绝对要求要使主要升级补丁发挥作用,请将RemoveExistingProducts 放置在InstallExecuteSequence 中的InstallFinalize 之后。这样做的原因是,否则在补丁包尝试修补现有文件之前,文件会被卸载。相当抓住22。
  • A 小升级不卸载现有安装,但评估重新缓存新的 MSI 文件用于维护和卸载操作。这意味着该补丁可以在运行之前修复卸载顺序 - 我上面列出的良好补丁用途之一。事实上,如果小升级有效,则可能根本不需要补丁。除非您的 MSI 文件非常大并且您想要提供一个小的“修补程序”,否则只需使用较小的升级即可。
  • 如果您需要在补丁中包含文件,我建议启用“包括整个文件”。否则将完成位级修补,这是不必要的复杂性(除非您的二进制文件非常庞大)。我也不确定位级修补如何与签名文件和数字签名一起使用。
  • 仅在补丁中包含您需要的内容。不添加不需要的文件或设置,您就可以制作可靠的补丁。如果可能的话,避免添加自定义操作。
  • 如前所述:请注意,补丁使用与常规安装相同的 InstallExecuteSequence,但您可以使用特定于补丁的属性(例如PATCH and MSI补丁删除。在自定义操作上使用这些条件,使它们在修补程序期间运行或不运行,具体取决于必要的情况。
  • 组件引用必须 100% 正确才能使任何类型的补丁发挥作用。没有例外。
  • 次要升级补丁必须使用正确的 msiexec.exe 命令行运行才能工作,除非通过 setup.exe / update.exe 提供。
  • 第三者合并模块根据我的经验,经常会导致修补问题。
  • "版本说谎正如他们所说 - 通过在 MSI 文件中为磁盘上的文件添加不同版本来确保文件始终更新的黑术似乎会导致修补错误。
  • 补丁将显示与主安装相同的 GUI。在我看来,这是一个错误的设计。 GUI 中的自定义操作可能会扰乱修补过程(您是否应该接受新的用户输入的修补程序值?)。
  • 我相信每个补丁都应该是累积的 - 替换所有以前的补丁。当我测试串联和顺序安装的多个补丁时,我再也没有恢复正常工作。出于多种原因,我得出的结论是,这是一个徒劳的修补方法首先。我遇到的问题与您所描述的补丁系列、目标版本等完全一致……补丁不太聪明,它只是一个由几个文件组成的复杂包,试图找到它所属的产品。

显而易见的结论是,我真的不建议您采用这种修补方法,即使被要求时也是如此。然而,我读到这个线程 https://stackoverflow.com/questions/9471790/patching-multiple-instance-installs-with-either-installshield-or-wix这似乎表明对于已转换为使用 WIX 而不是 Installshield 的人来说,修补成功。您还应该查看 CodeProject 链接。

As to 您的部署场景- 我没有完全掌握它的所有方面,但听起来开发人员希望通过补丁将实时应用程序转换为当前的 QA 版本?我永远不会同意这一点,否则情况一定与听起来不同。当您首先必须交付次要或重大升级时,创建补丁的精力完全是浪费——它们足以交付用于 QA 的软件。您可以使用 dev-branch 提供单独的 MSI,然后时不时地创建一些补丁来测试产品是否可修补,但我绝不会使用补丁在内部提供产品的安装程序。我不知道这是否是你被要求做的。

处理次要和主要升级 - 最好是后者用于非补丁,并在您真正需要时提供补丁。如果安装持续时间是一个问题,您可以安排在所有开发人员和 QA PC 上的夜间构建完成后进行每日重大升级吗? (包括终止安装工作所需的任何正在运行的进程)。我不知道我是否完全偏离了你的场景的真实情况。

检查斯特凡·克鲁格的安装站点.org http://www.installsite.org/pages/en/msi/updates.htm了解更多升级和修补技巧。

查看这个著名的 wix 教程 http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization用于升级和补丁。和MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa370579.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按顺序卸载补丁时 Windows Installer 出现“错误 1308。未找到源文件”场景 的相关文章

  • 是否可以以有限的权限安装到程序文件中?

    我有一个将作为 MSI 包部署的应用程序 在 WiX 中编写 我正在决定是否指定elevated or limited安装程序所需的权限 除了位于 Program Files 下的默认安装位置之外 该应用程序不包含任何需要提升权限的内容 现
  • 程序自我更新的最佳方式

    终止程序然后从正在终止的程序运行附加代码的最佳方法是什么 例如 程序自我更新的最佳方式是什么 您有几个选择 您可以使用另一个应用程序 exe 来进行自动更新 这可能是最好的方法 您还可以在程序运行时重命名程序的 exe 因此 您可以从某个更
  • 如何在 git 树的顶部应用补丁以防止重复?

    我正在为一个我认为很简单的问题寻求建议 并且通过创建一个小脚本确实可能很简单 但我认为应该已经有一种方法可以使用 git quilt stgit 来做到这一点 我不太擅长 git 这给我带来了一些问题 我的问题 我有一个 git 树 lin
  • Inno Setup - 允许用户选择“只有我”或“任何使用这台计算机的人”

    我遇到的一些安装程序让我选择 只为我 或 为 使用这台计算机的任何人 安装应用程序 如何让我的 Inno Setup 脚本向用户提供此选择 以便我可以根据他们的回答方式更改安装程序的操作 有很多方法可以解释 只有我 与 所有用户 问题的答案
  • 我可以在不接触工作目录的情况下导入补丁吗?

    通常 当我尝试导入补丁时 如果我的工作副本脏了 Mercurial 会中止 hg import x patch abort outstanding uncommitted changes 无论如何都可以导入吗 使用 Mercurial 1
  • Windows 安装程序中的主要与次要升级

    是否有任何理由不设置安装 以便始终完成主要升级并更改产品代码 我发现支持不同类型的安装需要更多代码 并且 修复 安装似乎通过重大升级更容易工作 而且需要安装的应用程序不是很大 因此不需要 服务包 或补丁安装程序 不会 如果您的应用程序很小并
  • 无法再卸载 Visual Studio 2017

    我在运行最新的 VS2017 时遇到了严重的问题 因为在我升级它时它进入了不一致的状态 有一些残留的软件包拒绝卸载 因为它们显然缺少来自的缓存文件C Windows Installer文件夹 我从来没有碰过那个文件夹 然而 我确实移动了C
  • MSI 与 nuget 包:哪个更适合持续交付?

    我们来讨论一下下面的话题 目前有一个应用程序正在使用熟悉的 xcopy 方法进行部署 这种方法使得管理依赖项 文件更新等变得困难 有一个想法是在一些软件包的帮助下开始应用程序部署 就像在 Linux 中借助RPM http en wikip
  • OSGi 应用程序修补策略

    修补 OSGi 容器的适当机制是什么 1 Should the bundles binaries jars have the same name as the old ones then a Replace the bundle with
  • 如何编写自定义操作 DLL 以在 MSI 中使用?

    这是我打算自己回答的问题 但请随意添加其他方法来完成此任务 我正在打包一个应用程序以用于各种配置 并且我确定在 MSI 中执行自定义逻辑的最可靠方法是编写我自己的自定义操作 DLL 该 DLL 能够从 PROPERTY 表中读取 写入 终止
  • 如何使用 msi 安装程序部署 VBA Excel 加载项 (foo.xlam)?

    我是一名 C 开发人员 正在将同事的 VBA Excel 加载项 xlam 文件 与我的 msi 安装程序 使用 VS 部署项目构建 如果重要的话 捆绑在一起 xlam 放置在应用程序文件夹 C Program Files x86 MyCo
  • 使用 Visual Studio 安装项目设置 InstallPath 注册表项

    我正在使用使用 Visual Studio 安装项目设计的 msi 安装程序来部署我的应用程序 如何将注册表项设置为应用程序的安装路径 实际上 当我在寻找同样的东西时 还提到了以下解决方案 在注册表项中使用 TARGETDIR
  • 如何将 Git 补丁应用到具有不同名称和路径的文件?

    我有两个存储库 其中 我对文件进行了更改 hello test 我提交更改并从该提交创建补丁git format patch 1 HEAD 现在 我有第二个存储库 其中包含一个与 hello test 内容相同的文件 但以不同的名称放置在不
  • 如何用mock修补模块的内部函数?

    我所说的 内部函数 是指从定义它的同一模块内调用的函数 我正在使用mock http www voidspace org uk python mock 图书馆 特别是patch http www voidspace org uk pytho
  • 使用帮助库管理器和 WiX 安装帮助

    我试图通过使用 WiX 运行 Sandcastle 帮助文件生成器在构建我的 Sandcastle 项目后创建的 HelpLibraryManagerLauncher 将我自己的帮助文件添加到 Visual Studio 2010 的帮助库
  • 从补丁文件中删除对特定文件的更改

    我有一个更改了许多文件的补丁文件 它意外地包含了对某些不应该更改的文件的更改 我可以手动从补丁中删除所有提及这些文件的内容 以生成正确的补丁文件 但这是一个繁琐的过程 如何以编程方式 标准 nix 工具 从补丁中删除所有提及文件的内容 注意
  • git am:补丁格式检测失败

    我以前从未在 Git 中使用过补丁 我需要一些帮助 我正在尝试将补丁应用到 Git 存储库来测试 Wine 补丁 特别是这个补丁在这里 https bugs winehq org attachment cgi id 60752 所以我做了以
  • Microsoft Visual Studio 安装程序项目 - 如何向使用 Process.Start() 执行但没有修复选项的 MSI 提供重新启动提示

    问题如下 我在 MSI 卸载之前调用了自定义卸载程序 正确关闭我的应用程序后 它会调用msiexec使用 Windows Installer 卸载 MSI 这是通过执行 msiexec x PRODUCT CODE promptrestar
  • 执行卸载之前停止 Windows 服务

    我有一个安装程序 它安装了一些组件 包括 Windows 服务 安装后它将启动使用 CustomAction 安装到系统上的服务 当我卸载应用程序时出现问题 安装程序要求先关闭应用程序 然后再继续 我创建了一个将停止服务的自定义操作 并通过
  • 在 WiX 文件中,Name="SourceDir" 指的是什么?

    WiX 文件似乎总是包含这一行

随机推荐

  • 使用 Java 8 Stream Reduce 在使用先前元素值对每个元素执行操作后返回 List

    我是 Streams 和 Reduce 的新手 所以我正在尝试它并遇到了一个问题 我有一个计数器列表 其中有开始计数器和结束计数器 一个项目的起始计数器始终是前一个项目的结束计数器 我有这些计数器的列表listItems我想有效地循环遍历
  • Mongodb 2dsphere索引嵌套数组字段

    我创建了集合 对象如下所示 id gt MongoId Object id gt 53087f483b15eaeb6c3c9869 time from gt 2014 02 22 00 00 00 time to gt 2014 02 22
  • 向 GUI 添加标签和文本框控件

    我想知道要插入什么代码以及在哪里添加一个简单的标签 只能说 标签 和一个可以输入数字的输入文本框 public CalculateDimensions JTabbedPane Tab new JTabbedPane JPanel jplIn
  • nodejs mysql 多个where查询

    我在nodejs中使用mysql已经有一段时间了 我似乎不知道如何使用多个where语句的查询 喜欢 SELECT FROM user information WHERE a a 或 b b 现在我有这个作为我的代码 connection
  • React-Table:如果用鼠标单击(选择)行,如何更改行的背景颜色?

    我有以下代码用于检索单击行的数据
  • 嵌套父/子复选框 - 工作解决方案需要 Bootstrap 的调整帮助

    我一直在寻找一个 完整 的解决方案来嵌套父子复选框 根据层次结构正确更改状态 大多数 解决方案 不起作用或只能在一定程度上起作用 它们还要求您以特定方式命名复选框 This https stackoverflow com questions
  • 如何让 Android 图标改变状态(突出显示)?

    我正在小部件中使用 Android SDK 图标按钮进行刷新 ic menu refresh 并且我需要在按下该按钮时更改选择状态 这是怎么做到的 我是否为按钮定义 XML 您可以通过选择器在 xml 中定义不同的状态 示例 尤其是查看状态
  • Yeoman 和 ExpressJS

    我想知道是否有一些样板代码可以使用像 Yeoman 这样的前端工作流工具和像 ExpressJS 这样的后端框架 如果我想为前端和后端维护相同的代码库 基本上我想知道 yeoman 和express 生成的样板代码如何组合在一起 有没有办法
  • html 列的宽度根据其内容自动改变

    我创建了包含 3 列的动态 HTML 页面 每列可以包含可变数量的文本 从 0 到 1000 个单词 我希望 3 列中的文本看起来高度大致相同 因此 我希望列宽根据其包含的文本量自动更改 在 HTML 中 当每个单元格都有一个文本 div
  • ListView 和 ListView 内的按钮

    我想显示一个Button在 的里面ListView 目标应该是点击ListView线或按钮上 单击显示更多信息的行 单击底部显示更多按钮的按钮 与 GMAIL 应用程序相同 右侧有一个复选框 单击底部的复选框后 会出现按钮栏 我的问题是在将
  • 使用省略号重塑 numpy 数组的问题

    我正在尝试为项目复制以下批处理生成器 但是我在重塑数据时遇到问题 该函数的目标是获取 6000 3000 数组并将其重塑为 batch size 100 3000 1 我正在尝试复制的功能代码 def gen dict files aug
  • jUnit 4 中的 TestSuite 设置

    我已经设法找到如何在 jUnit 4 中制作 TestSuite 但我真的很怀念在 TestSetup 中包装套件的 v3 可能性 关于如何为 jUnit 4 中的一组测试用例执行一些 BeforeClass AfterClass 设置 有
  • 更改按钮锚点 SwiftUI

    我正在尝试更改确定按钮中心的锚点 以下代码将按钮放置在框架的左上角 Button action print self note Text note position x 0 0 y 0 0 如果我使用 offset 代替 那么它就会起作用
  • 空手道——并行执行失败[重复]

    这个问题在这里已经有答案了 我观察到 当我使用 Runner parallel getClass 1 在 Maven 构建中运行测试 功能文件 时它工作正常 但是当我增加像 Runner parallel getClass 5 这样的线程数
  • 邪恶巫师动态步骤顺序

    我正在尝试根据先前选择的选择来更改邪恶向导中的步骤顺序 所以目前我已经完成了所有步骤 class WWTestController lt ApplicationController include Wicked Wizard steps f
  • 如何让 Visual Studio 在没有警告的情况下处理 HTML 5 标签

    我有各种 html 标签 与 jquery mobile 相关 Visual Studio 将其标记为无效属性 例如 div 其中包括 Validation XHTML 1 0 Transitional Attribute data rol
  • 安装 Virtualenv 并激活 virtualenv 不起作用

    我从 Github 帐户克隆了我的 Django 项目 并使用著名的命令激活了 virtualenvsource nameofenv bin activate当我跑步时python manage py runserver 它给了我一个错误
  • 访问通过 window.open 方法检索的 Document 元素

    我想根据提供的网址弹出一个新的浏览器 为此我使用 javascript 的 window open 函数 但是 我真正想要的是检查弹出的新窗口并更改它的 url 并重定向到另一个站点 这就是我尝试做的方法
  • 使用 php include 标题、导航和其他元素时的良好做法?

    我不知道专业的网页设计师通常如何分隔这些元素 像这样 或者就像这样 或者只是将我想要重复的所有元素放在一起 我应该在这些元素中使用 php 或 html 扩展吗 头部 导航等 我该怎么办
  • 按顺序卸载补丁时 Windows Installer 出现“错误 1308。未找到源文件”场景

    我需要使用 Patch Design 和 Installshield 2012 创建的一系列可卸载补丁 前两个补丁在卸载时工作正常 但是 当且仅当已应用补丁 1 和 或补丁 2 时卸载第三个补丁时 才会产生错误 MSI c 48 C4 19