4

私は次のCostomActionを持っています

<Binary Id='ManualsBat' SourceFile='bin\Debug\test.bat' />

<CustomAction 
  Id="manuals"
  BinaryKey="ManualsBat"
  ExeCommand="[SourceDir]Manuals &quot;[Agent]Manuals&quot;"
  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 を実行してもエラーが発生せず、ログ ファイルに次のように表示されます。

エラー 1721。この Windows インストーラー パッケージには問題があります。このインストールを完了するために必要なプログラムを実行できませんでした。サポート担当者またはパッケージ ベンダーにお問い合わせください。アクション: マニュアル、場所: C:\Windows\Installer\MSI1F50.tmp、コマンド: C:\dev\CD\Agent\pd\components\link\source\Link\Installer\WiX\WiX\bin\Debug\Manuals " D:\Cam\city\Agent\Manuals

この種のエラーを経験した人はいますか。誰かが私がこれを解決するのを手伝ってくれるなら、それは素晴らしいことです.

4

3 に答える 3

5

ほとんどの場合、カスタム アクションには管理者権限が必要です。Execute属性をdeferredおよびImpersonateに設定してみてくださいnoInstallFinalizeこれらのオプションでは、標準アクションの後にアクションをスケジュールする必要があることに注意してください。

于 2012-08-10T08:45:34.320 に答える
5

引用符の問題かもしれません。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>
于 2013-02-19T20:34:47.270 に答える
2

通常、.bat ファイルを処理するには、cmd /c foo.bat (または Win9x のコマンド) を呼び出す必要があります。

ただし、インストーラーでこれを行うことは決してありません。Windows インストーラーの全体的な設計に違反しています。MSI は、トランザクショナルな宣言型プログラミング言語です。プロセス外の手続き型コードを挿入すると、失敗の可能性が大幅に増加し (経験しているように)、さらに悪いことに、MSI のトランザクションの利点が損なわれます。

たとえば、フォルダーを作成してファイルをコピーすると、ロールバック中に元に戻されず、アンインストール中に削除されません。代わりに、組み込みの Windows インストーラー機能 ( CreateFolder および CopyFile 要素) を使用して、目的を達成する必要があります。

カスタム アクションが本当に必要な場合 (あなたの例では、劣ったソリューションで車輪を再発明しているだけです)、堅牢な言語を使用して設計し、MSI が使用するセキュリティ モデルを尊重しながら、宣言型 (データ駆動型) およびトランザクション設計を維持する必要があります。 .

于 2012-08-11T14:25:22.803 に答える