我正在使用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"
有什么问题?为什么不能执行标准命令?
答案 0 :(得分:1)
在命令提示符下运行的内容与实际命令之间存在重要区别。在这种情况下,for
和rd
是内置的,只有xcopy
是它自己的命令。要确定这一点,您可以在命令提示符下运行where for
,where xcopy
和where rd
。此外,Windows Installer通常需要您指定命令的完整路径。这可能采用类似[SystemFolder]xcopy.exe
的形式,但对于内置函数则不可能。相反,您需要指定[SystemFolder]cmd.exe /c rd ...
请注意,这并不是实现您想要完成的目标的好方法。安装期间弹出的命令提示不仅看起来很糟糕,而且还不能很好地与日志记录,错误报告或回滚集成。如果可能,最好使用真正的Windows Installer功能(例如通过DuplicateFile和RemoveFile表),因为它们旨在处理回滚方案。如果没有,如果你写一个C++ custom action dll并使用它而不是exes,你至少可以获得更好的集成。
答案 1 :(得分:0)
您需要在可执行应用程序上执行命令,在您的情况下,它将是cmd.exe。
ExeCommand='cmd.exe /c "for %a in (*.config) do ren "%~a" "%~na_new%~xa"""'
将您的代码更改为此代码,它应该有效:)