2016-12-20 10 views
0

私はWiX Toolsetを使用してインストーラを作成しています。チェックボックスをオンにして古い構成(.config拡張子のファイル)をバックアップし、新しいファイルをインストールする場合は、_newに名前を追加します。インストーラのカスタムアクションとしてCmdが動作しない

これを達成するための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" 

間違っていますか?標準コマンドを実行できないのはなぜですか?

答えて

1

コマンドプロンプトで実行できるものと実際には何かが重要な違いがあります。この場合、forrdが組み込まれており、xcopyというのはそれ自身のコマンドです。これを確認するには、コマンドプロンプトでwhere for,where xcopyおよびwhere rdを実行します。また、Windowsインストーラでは、コマンドのフルパスを指定する必要があります。これは[SystemFolder]xcopy.exeのような形を取るかもしれませんが、組み込みの場合は不可能です。代わりに、何かを指定する必要があります[SystemFolder]cmd.exe /c rd ...

これは実際に達成したいことを達成するための素晴らしい方法ではないことに注意してください。インストール中に表示されるコマンドプロンプトは悪く見えるだけでなく、ログ、エラー報告、またはロールバックとうまく統合されません。可能であれば、ロールバックシナリオを処理するように設計されているため、Windowsインストーラの実際の機能(DuplicateFileRemoveFileテーブルなど)を使用するのが最適です。そうでなければ、C++ custom action dllと書いてexesの代わりに使うと、少なくとももっと良い統合を得ることができます。

+0

1は非常に同じタスクを実行するためのWiX機能で構築されており、C++/C#を(使用して使用することをお勧め:)動作するはずです)カスタムアクション。 –

0

実行可能なアプリケーションでコマンドを実行する必要があります。実行可能なアプリケーションで実行する場合は、cmd.exeになります。

ExeCommand='cmd.exe /c &quot;for %a in (*.config) do ren "%~a" "%~na_new%~xa"&quot;"' 
は、このにコードを変更し

、それはあなたが.NETが常に存在している知っている場合

関連する問題