我跟踪了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它的基本目的是,在运行安装程序时,需要执行批处理文件。批处理文件必须创建一个新目录" AgentManuals“,并且必须将所有文件从SourceDirManuals复制到AgentManuals。
当我构建.wxs时,它不会给出任何错误,但是当我运行.msi时,它会在日志文件中抱怨以下情况
错误1721此Windows Installer程序包存在问题。无法运行此安装所需的程序。请与您的支持人员或软件包供应商联系。操作:手册,位置: C:\Windows\Installer\MSI1F50.tmp,命令: C:\dev\CD\Agent\pd\components\link\source\Link\Installer\WiX\WiX\bin\Debug\Manuals“D:\Cam\city\Agent\手册
有没有人有过这种错误的经验。如果有人能帮我解决这个问题,那就太好了。
发布于 2012-08-10 08:45:34
很可能您的自定义操作需要管理员特权。尝试将Execute属性设置为deferred,将Impersonate设置为no。请注意,这些选项要求操作在InstallFinalize标准操作之后排定。
发布于 2013-02-19 20:34:47
也许引号有问题。更改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>发布于 2012-08-11 14:25:22
通常需要调用cmd /c foo.bat (或Win9x上的命令)来处理.bat文件。
但是,我绝不会在我的安装程序中这样做。它违反了Windows安装程序的总体设计。MSI是一种事务性的声明性编程语言。注入流程外的过程代码极大地增加了失败的可能性(正如您正在经历的那样),更糟糕的是,它破坏了MSI的事务好处。
例如,如果您创建了一个文件夹并复制了一个文件,那么在回滚过程中该文件将不会被撤消,并且在卸载过程中也不会被删除。相反,您应该使用内置的Windows特性( CreateFolder和CopyFile元素)来实现您的目标。
在确实需要自定义操作的情况下(在您的示例中,您只是在用低劣的解决方案重新发明轮子),应该使用健壮的语言设计它们,并维护声明性(数据驱动)和事务性设计,同时尊重MSI使用的安全模型。
https://stackoverflow.com/questions/11896681
复制相似问题