Cmd不能用作安装程序自定义操作

时间:2016-12-20 10:37:50

标签: wix windows-installer config

我正在使用WiX Toolset创建安装程序。我想在选中复选框时备份旧配置(带有 .config 扩展名的文件),然后安装新的配置,并在名称后添加 _new

我已经创建了cmd脚本来实现它并将它们插入到自定义操作中。

<CustomAction Id="RenameNewConfigs" Directory="INSTALLFOLDER" ExeCommand='for /r %%a in (*.config) do ren "%%~a" "%%~na_new%%~xa"' Impersonate="no" Execute="deferred" Return="ignore" />
<CustomAction Id="MoveOldConfigs" Directory="INSTALLFOLDER" ExeCommand='xcopy /SYI "..\OldConfigs" "."' Impersonate="no" Execute="deferred" Return="ignore" />
<CustomAction Id="RemoveConfigsBackup" Directory="INSTALLFOLDER" ExeCommand='rd ..\OldConfigs /S /Q' Impersonate="no" Execute="deferred" Return="ignore" />
<InstallExecuteSequence>
  <Custom Action="RenameNewConfigs" After="InstallFiles">KEEP_OLD_CONFIGURATION</Custom>
  <Custom Action="MoveOldConfigs" After="RenameNewConfigs">KEEP_OLD_CONFIGURATION</Custom>
  <Custom Action="RemoveConfigsBackup" After="MoveOldConfigs">INSTALLED AND (NOT REMOVE="ALL")</Custom>
</InstallExecuteSequence>

在执行期间(根据日志),第一个和第三个命令产生以下输出:

Info 1721. There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor. Action: RenameNewConfigs, location: C:\Program Files\correct\path\, command: for /r %%a in (*.config) do ren "%%~a" "%%~na_new%%~xa"

有什么问题?为什么不能执行标准命令?

2 个答案:

答案 0 :(得分:1)

在命令提示符下运行的内容与实际命令之间存在重要区别。在这种情况下,forrd是内置的,只有xcopy是它自己的命令。要确定这一点,您可以在命令提示符下运行where forwhere xcopywhere rd。此外,Windows Installer通常需要您指定命令的完整路径。这可能采用类似[SystemFolder]xcopy.exe的形式,但对于内置函数则不可能。相反,您需要指定[SystemFolder]cmd.exe /c rd ...

之类的内容

请注意,这并不是实现您想要完成的目标的好方法。安装期间弹出的命令提示不仅看起来很糟糕,而且还不能很好地与日志记录,错误报告或回滚集成。如果可能,最好使用真正的Windows Installer功能(例如通过DuplicateFileRemoveFile表),因为它们旨在处理回滚方案。如果没有,如果你写一个C++ custom action dll并使用它而不是exes,你至少可以获得更好的集成。

答案 1 :(得分:0)

您需要在可执行应用程序上执行命令,在您的情况下,它将是cmd.exe。

ExeCommand='cmd.exe /c &quot;for %a in (*.config) do ren "%~a" "%~na_new%~xa"&quot;"'

将您的代码更改为此代码,它应该有效:)