4

我有以下 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 时没有给出任何错误,然后它在日志文件中抱怨以下内容

错误 1721。此 Windows 安装程序包有问题。无法运行完成此安装所需的程序。请联系您的支持人员或软件包供应商。操作:手册,位置:C:\Windows\Installer\MSI1F50.tmp,命令:C:\dev\CD\Agent\pd\components\link\source\Link\Installer\WiX\WiX\bin\Debug\Manuals" D:\Cam\city\Agent\Manuals

有没有人遇到过这种错误。如果有人可以帮助我解决这个问题,那就太好了。

4

3 回答 3

5

引号中可能有问题。更改 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>
于 2013-02-19T20:34:47.270 回答
5

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

于 2012-08-10T08:45:34.320 回答
2

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

但是,我永远不会在我的安装程序中这样做。它违反了 Windows Installer 的整体设计。MSI 是一种事务性的、声明性的编程语言。注入进程程序代码大大增加了失败的可能性(正如您所经历的那样),并且更糟糕的是破坏了 MSI 的事务优势。

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

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

于 2012-08-11T14:25:22.803 回答