2

我有一个可以在安装时给出正确标志的应用程序(/logLevel=debug安装时在服务启动时传递给应用程序)。我们的更新过程是自动卸载,然后使用新的 MSI 包安装。我知道 WiX 内置了补丁功能,但这是我们的流程。

logLevel参数类似,我想UPDATE="true"在卸载期间在命令行上传递一些效果。当此参数传递给卸载程序时,它不应删除日志文件。目前我们每次都删除文件,但希望在更新期间保留日志文件。这就是我现在正在尝试扩展的内容:

<?if $(var.BUILD_CONFIG) = "Debug" ?> 
<?else?>
  <CustomAction Id="Cleanup_logfile" Directory="TempTest"
   ExeCommand="cmd /C &quot;del %systemroot%\temp\hexis_hawkeye_g.log.*&quot;"
   Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />

  <InstallExecuteSequence>
    <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
      REMOVE="ALL"
    </Custom>
  </InstallExecuteSequence> 
<?endif?> 

而且我一直在使用类似于以下内容的代码,但它似乎不起作用:

<?if $(var.BUILD_CONFIG) = "Debug" ?> 
<?else?>
  <?if '[UPDATE]' = "true" ?>
  <?else?>
    <CustomAction Id="Cleanup_logfile" Directory="TempTest"
     ExeCommand="cmd /C &quot;del %systemroot%\temp\hexis_hawkeye_g.log.*&quot;"
     Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
      <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
        REMOVE="ALL"
      </Custom>
    </InstallExecuteSequence> 
  <?endif?>
<?endif?>

我不确定我是否没有UPDATE正确初始化变量,或者这是否真的是一些无法以这种方式实现的预处理。我认为它不起作用,因为这些构造在预处理器文档页面上进行了描述,但是,/logLevel以及各种其他参数似乎在运行时安装时工作正常。我完全是 WiX 文盲,并且一直试图阅读他们的文档但无济于事,任何有用的链接表示赞赏。

4

2 回答 2

3

我看到的问题是:在卸载应用程序的重大升级期间(以及稍后安装新版本)REMOVE=ALL在卸载应用程序期间也是如此,因此文件将被删除。
您还需要检查是否UPGRADINGPRODUCTCODE也设置了,这仅在更新期间为真。

在给出正确条件的地方检查这个答案(并像我一样为问题添加书签,它对所有可能的状态和条件都非常有用;-))。

在您的情况下,正确的条件应该如下:

<InstallExecuteSequence>
  <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
    (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
  </Custom>
</InstallExecuteSequence>
于 2014-08-25T16:17:22.067 回答
0

这可能有点骇人听闻,但我能够通过从 LOGLEVEL 暗示要采取什么行动而不是传递任意变量来传递我想要的:

msiexec.exe /x {blah-blah-guid-blah} INSTALLLEVEL=2

对于我的自定义操作的配置:

<?if $(var.BUILD_CONFIG) = "Debug" ?> 
<?else?>
  <CustomAction Id="Cleanup_logfile" Directory="TempTest"
   ExeCommand="cmd /C &quot;if [INSTALLLEVEL] GEQ 2 del %systemroot%\temp\hexis_hawkeye_g.log.*&quot;"
   Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />

  <InstallExecuteSequence>
    <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
      REMOVE="ALL"
    </Custom>
  </InstallExecuteSequence> 
<?endif?> 
于 2014-08-26T19:22:18.717 回答