8

複数の .msi ファイルをサイレント モードで呼び出し、失敗した場合はインストール全体を停止したいと考えています。

[run] セクションから呼び出された msiexec.exe のリターン コードを取得することはできますか?

現在、Windows イベント ビューアでしかエラー メッセージを表示できません。

4

2 に答える 2

5

現在、[Run]エントリが正常に実行されたことを確認する方法はありません。コードはプロセスの終了コードをログに記録し、次のエントリに進みます (Inno Setup ソース ファイルMain.pasで調べることができます。関数はProcessRunEntry()で、現在のバージョン 5.2.3 では 3404 行目から始まります)。

msiexec の複数回の実行がすべて成功したことを確認する必要がある場合は、中間層をコーディングする必要があります。これは、[Run] エントリで実行され、正しいパラメータで msiexec.exe を開始し、プロセスが終了するのを待ってから、リターン コードをファイルに書き込む小さなスタブと同じくらい簡単です。

このようなインストール手順の成功を確認する別の方法は、 AfterInstallパラメータを使用して、 [Run]エントリごとにカスタム プロシージャ コールを追加することです。このような関数では、たとえば、OCX コントロールが正常にインストールされたかどうかを確認できます。

[Run]
Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1

[Code]
var
  MyInstallation1Success: boolean;

procedure AfterMyInstallation1;
var
  V: Variant;
begin
  try
    V := CreateOleObject('MyInstallation.InstalledOcxControl.1');
    MyInstallation1Success := True;
  except
    MyInstallation1Success := False;
  end;
end;

または、依存関係のディレクトリとレジストリ エントリがすべて存在するかどうか。

[Run]エントリは、オプションのCheckパラメータが true を返す場合にのみ実行されます。そのため、必要に応じて、すべてのサイレント インストールを順番に開始し、最後のインストールが完了したらスクリプト関数を実行して、すべての依存関係が正常にインストールされたことを確認することができます。または、依存関係のインストールごとにチェック関数を作成すると、false が返され、最初に失敗したインストールの後に他のすべてのインストールがスキップされます。

ただし、ファイルのコピーやレジストリの書き込みなどの手順が完了すると、すべての[Run]エントリが実行されるため、基本的にインストールは完了しています。すべての依存関係が正しくインストールされている場合にのみ、すべてのインストール手順を本当に実行したい場合は、インストールがまだキャンセルできるときに、プロセスの早い段階で実行する必要があります。

編集:「長いExecの実行中にInno Setupがフリーズしていないようにするにはどうすればよいですか?」という質問を確認してください。ここでは、依存関係をインストールするためのExec()関数の使用に関する情報とサンプル スクリプトがリンクされています。したがって、 [Run]エントリを使用しない場合は、目的を達成できる可能性が高くなります。

于 2009-02-24T17:03:05.867 に答える
1

同様の質問に対する私の回答を使用して、[Run] セクションでコマンドを安全に実行し、適切な通知とエラー時のロールバックを行うことができます。

上記のリンクは完全な解決策を提供しますが、アイデアは次のとおりです。

1) InnoSetup の BeforeInstall パラメータを使用して、一時ファイル {tmp}\install.error にエラー メッセージを書き込みます。

2) Windows コマンド シェル「cmd.exe /s /c」を使用して、目的のプログラムを実行します。「&&」を使用した「del」コマンドの条件付き実行も使用します - http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true。したがって、コマンドが成功した場合 (終了コード 0)、エラー メッセージ ファイルは削除されます。「cmd.exe /s /c」での特別な引用符の扱いに注意してください。

3) InnoSetup の AfterInstall パラメータを使用してエラー メッセージ ファイル {tmp}\install.error の存在を確認し、適切な通知または確認 (およびオプションでログ ファイルの表示) を使用してインストールを中止し、Exec(ExpandConstant('{uninstallexe}') を使用してロールバックを実行します。 ...

4) InnoSetup の ShouldSkipPage(PageID: Integer) 関数をオーバーライドして最終ページを非表示にするなど、いくつかの追加手順を実行する必要があります。

于 2014-06-20T08:42:17.003 に答える