0

Wise でビルドされた従来のインストーラーがあり、セキュリティ上の問題に対処するために、一部の .ASP ファイルが対応する .INC ファイルに置き換えられた状況があります。そのため、アップグレード中に古い .ASP ファイルを削除する必要があります。ディレクトリの 1 つで動作していますが、他の 2 つのディレクトリでは、アップグレード後も古い .ASP ファイルが残っています。

Web サイトのすべてのディレクトリには、アンインストール中にすべてのファイルを削除するようインストーラーに指示する RemoveFile エントリがあるため、インストーラーにこれらの古いファイルを削除させるにはそれで十分だと思っていましたが、そうではないようです。

この問題を解決するために、インストール時に特定のファイルを削除する RemoveFile エントリを追加し、アップグレードを再試行しましたが、それでもうまくいきませんでした。

これらのファイルを削除するためのカスタム アクションを作成する以外に、それを機能させる方法についてアイデアを持っている人はいますか?

4

2 に答える 2

0

私の問題は MSI 関連ではないことがわかりました。インストールのカスタム アクションの 1 つは、すべての Web サイト ファイルをバックアップして、後でアップグレードの別のカスタム アクションによって復元できるようにすることでした。古い .ASP ファイルが削除されたように見える 1 つのディレクトリでは、そのディレクトリが非表示になっていたため、バックアップも復元もされていませんでした。バックアップと復元の間、MSI は実際にその仕事をしており、新しいものがインストールされる前に古いビルドからすべてを削除していました。(私がそのプロジェクトからどれだけ離れていたかを示していますが、それが起こっていたことを忘れていました. :-( )

于 2016-06-28T00:01:59.650 に答える
0

Windows インストーラーでは、コンポーネント GUID がすべてです。10 個のファイルをインストールした場合、それらはすべて固有のコンポーネント GUID を持ちます。これらのファイルのうちの 5 つが不要になり、他の 5 つのファイルに置き換わる製品にメジャー アップグレードを行う場合、明らかに、古いファイルをアップグレードに含めませんが、これらの 5 つの新しいファイルと 5 つの新しいコンポーネント GUID を追加します。言い換えれば、症状は、新しいファイルを追加したが、既存のコンポーネント GUID を保持したことを示唆しています。メジャー アップグレードには古い製品のアンインストールが含まれますが、同じコンポーネント GUID を使用すると、GUID の参照カウントがゼロにならず、それらのコンポーネント (したがってファイル) がアンインストールされることはありません。

また、コンポーネントが永続的とマークされていた場合、またはファイルが共有とマークされていた場合、ファイルは削除されません。コンポーネントを永続的にマークするとシステムに固定されるため、MSI を再構築して永続的でないとマークしても問題は解決しません。コンポーネントには追加の再カウントがあります。ファイルが明示的に共有としてマークされている場合、MSI 以外のインストールを介してインストールできる (コンポーネント GUID ref はカウントされない) ことを意味し、MSI には別のエントリがあると通知されているため、レジストリの SharedDlls にエントリが存在します。非 MSI クライアント。レジストリで SharedDlls を調べて、それが発生したかどうかを確認できます。コンポーネントの参照カウントを発見するのはより困難ですが、アップグレードの詳細なログが役立ちます。この VB スクリプトは、インストールされているすべてのコンポーネントとそれらを使用している製品を表示します。

オプション明示
パブリック インストーラー、fullmsg、comp、a、prod、fso、pname、ploc、pid、psorce

fso = CreateObject("Scripting.FileSystemObject") を設定します。 = fso.CreateTextFile("comps.txt", True) を設定します。

' Windows インストーラー オブジェクトに接続 インストーラーを設定 = CreateObject("WindowsInstaller.Installer") a.writeline (「MSI コンポーネント」) エラーで次に再開 For Each comp Ininstaller.components a.writeline (comp & " は製品で使用されます:") Installer.ComponentClients (comp) の各製品について pid = インストーラー.コンポーネントパス (製品、コンポーネント) pname = installer.productinfo (prod、「InstalledProductName」) a.Writeline (" " & pname & " " & prod & "and is installed at " & pid) 次 次

enter code here
于 2016-06-23T21:59:00.330 に答える