私はすでに同様の質問に答えました。
Windows バッチ ファイルがコマンドの完了を待機しない
通常、次の 2 行のバッチ ファイルがある場合:
call msiexec /x {...} /qb
call msiexec /i "c:\myPath\myProduct.msi" /qb
インストールが開始される前にアンインストールが待機するという意味で機能するはずです。
- 「呼びかけ」が大事!
- 以前のバージョンをアンインストールするには
/x {ProductCode to fill in}
、/x "filename"
. いずれの場合も、製品コードを使用する方が安全です。
- 何が起こるかを確認するために
pause
、2 つの行と最後に行を追加できます。
それでも問題が解決しない場合は、製品が実際にアンインストールされるまでループし、2 秒待ってからインストールを続行してください。
プログラムがまだインストールされているかどうかを確認する方法はいくつかあります。
ほとんどの人は、最も簡単なソリューションとして VB スクリプトを推奨しますが、少なくともこれらは最もよく知られています。別の質問からのアンインストール呼び出しに対する saschabeaumont からの VBS スニペットを次に示し
ます。「この製品の別のバージョンが既にインストールされているため、MSI インストールが失敗します」
主に与えられた商品名(部分)のProductCodeを探し出し、一致すればアンインストールを開始します(部分一致に注意)。アンインストールが既に完了している場合 (= 製品がインストール済み製品のリストに含まれていない場合) は、同じ目的で使用し、アルゴリズムをもう一度コピーして非同期に要求することができます。
もちろん、JScript、Powershell、および従来のプログラミング言語など、他のスクリプト言語でも可能です。純粋なバッチ スクリプトで実行するのは困難です。たとえば、製品がインストールされている場合、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallの下の ProductCode レジストリ エントリをテストできます。ただし、言及すべき欠点が 1 つだけあります。バッチが 32/64 ビット サブシステムから開始された場合や MSI が 32/64 ビットである場合は、違いを考慮する必要があります。したがって、バッチの代わりに VBS を使用することをお勧めします (バッチから で呼び出すことができますcscript xxx.vbs
)。