我有一个自定义操作,在升级过程中,会在installFiles之前删除某些文件,这会将新文件放回去。我注意到的是该操作被调用了2次。 1.Gets调用并删除文件。 2. InstallFiles复制新文件。 3.Again被调用并删除文件。(不应该发生)。
我的自定义操作如下 -
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize" />
<Custom Action="NEWER_VERSION_PRESENT" After="FindRelatedProducts">
NEWER_VERSIONS
</Custom>
<Custom Action="DeleteourFiles" Before="InstallFiles"></Custom>
</InstallExecuteSequence>
我在某处读到,对于升级方案,此自定义操作会被调用两次。我想知道如何防止它第二次被调用。基本上希望我的自定义操作在放入新文件之前删除旧版本的某些文件。我应该使用什么条件?
答案 0 :(得分:1)
您的旧安装将被删除并删除文件。
<RemoveExistingProducts After="InstallFinalize" />
安排旧安装程序的运行以在InstallFinalize之后将其卸载,然后InstallFinalize将您的安装作为卸载运行。
<Custom Action="DeleteourFiles" Before="InstallFiles"></Custom>
没有任何条件,因此无论是安装还是卸载或升级,每次安装都会运行它。
如果您希望它在升级安装期间运行,并且当您明确卸载时,则需要添加
<Custom Action="DeleteourFiles" Before="InstallFiles">NOT UPGRADINGPRODUCTCODE</Custom>
在升级过程中,您运行的安装将运行已安装的(旧版本)安装程序,并将UPGRADINGPRODUCTCODE定义为其自己的产品代码。因此,如果您说仅在未定义UPGRADINGPRODUCTCODE时运行此自定义操作,则在升级安装中升级一次而不是在旧升级安装中升级时将运行此操作,然后在您明确卸载产品时也是如此。
由于您是如何创作的,因此升级所有以前发布的安装时仍会遇到问题。您可以通过更改删除现有产品的计划来解决此问题。
如果您使用
<RemoveExistingProducts After="InstallInitialize" />
它将在开始时卸载以前的版本而不是结束,这应该可以解决两次运行DeleteourFiles自定义操作的问题。
另一件值得提及的是,通常你没有在InstallExecuteSequence标签中明确安排“RemoveExistingProducts”
通常,您会在MajorUpgrade标记
中定义此计划