与CustomAction相关的Wix错误1721

时间:2012-08-10 06:42:33

标签: wix custom-action windowserror

我有以下CostomAction

<Binary Id='ManualsBat' SourceFile='bin\Debug\test.bat' />

<CustomAction 
  Id="manuals"
  BinaryKey="ManualsBat"
  ExeCommand="[SourceDir]Manuals &quot;[Agent]Manuals&quot;"
  Execute="immediate"
  Return="check" />

test.bat包含以下行:

@echo off
echo Hello this a test batch file
pause
mkdir %2
copy %1 %2

基本上要做的是,在运行安装程序时,需要执行批处理文件。批处理文件必须创建一个新目录“[Agent] Manuals”,它必须将[SourceDir] Manuals中的所有文件复制到[Agent] Manuals。

当我构建.wxs时,当我运行.msi时它没有给出任何错误bur,然后它在日志文件中抱怨以下内容

  

错误1721.此Windows Installer程序包存在问题。无法运行此安装所需的程序。请联系您的支持人员或包装供应商。操作:手册,位置:C:\ Windows \ Installer \ MSI1F50.tmp,命令:C:\ dev \ CD \ Agent \ pd \ components \ link \ source \ Link \ Installer \ WiX \ WiX \ bin \ Debug \ Manuals“ d:\凸轮\城市\代理\手册

有没有人遇到过这种错误。如果有人可以帮我解决这个问题,那将会很棒。

3 个答案:

答案 0 :(得分:4)

您的自定义操作很可能需要管理员权限。尝试将Execute属性设置为deferred,将Impersonate设置为no。请注意,这些选项要求在InstallFinalize标准操作后安排操作。

答案 1 :(得分:3)

引号可能有问题。更改ExeCommand引号。 试试这个:

<Binary Id='ManualsBat' SourceFile='bin\Debug\test.bat' />

<CustomAction 
  Id="manuals"
  BinaryKey="ManualsBat"
  ExeCommand='"[SourceDir]Manuals" "[Agent]Manuals"'
  Execute="deferred"
  Impersonate="no"
  Return="check" />

<InstallExecuteSequence>
  <Custom Action="manuals" Before="InstallFinalize">Not Installed</Custom>
</InstallExecuteSequence>

答案 2 :(得分:1)

您通常需要调用cmd / c foo.bat(或Win9x上的命令)来处理.bat文件。

但是,我永远不会在我的一个安装程序中执行此操作。它违反了Windows Installer上的整体设计。 MSI是一种事务性的声明性编程语言。注入流程程序代码会大大增加失败的可能性(正如您所经历的那样),并且更糟糕的是会破坏MSI的交易利益。

例如,如果您创建文件夹并复制文件,则在回滚期间不会撤消该文件,并且在卸载期间不会删除该文件。相反,您应该使用内置的Windows Installer功能(CreateFolder和CopyFile元素)来实现您的目标。

在真正需要自定义操作的情况下(在您的示例中,您只是使用较差的解决方案重新发明轮子),他们应该使用健壮的语言设计并维护声明(数据驱动)和事务设计,同时尊重安全模型MSI使用。