我有以下CostomAction
<Binary Id='ManualsBat' SourceFile='bin\Debug\test.bat' />
<CustomAction
Id="manuals"
BinaryKey="ManualsBat"
ExeCommand="[SourceDir]Manuals "[Agent]Manuals""
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:\凸轮\城市\代理\手册
有没有人遇到过这种错误。如果有人可以帮我解决这个问题,那将会很棒。
答案 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使用。