web-dev-qa-db-ja.com

.msiファイルが存在しない製品ID guidを使用してmsiexecでアンインストールする方法

OS全体を再プロビジョニングせずに、インストールされているソフトウェアスタックと構成を変更する目的で、WiXを使用して作成されたパッケージのアンインストールを自動化しようとしています。最終的にはpowershellスクリプトを使用してこれを行いますが、現時点では、cmdを使用してインタラクティブにアンインストールするテストパッケージを取得できないようです。

私が実行した場合:

msiexec /x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'

msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8

私は得る:

"インストールパッケージを開けませんでした。パッケージが存在し、アクセスできることを確認するか、アプリケーションベンダーに連絡して、これが有効なWindowsインストーラパッケージであることを確認してください。"

実行した場合:msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

私は得る:

"このアクションは、現在インストールされている製品にのみ有効です"

windows installer guideWiX documentation 、msiexec documentationを見て、orcaを使用して.msiを自分で調べましたが、実際に与えるものは見つかりませんでしたアンインストールがどのように処理されるかの明確な画像。 .msiファイルは必要ですか?必要でない場合、WindowsインストーラーはGUIDが与えられたときにそれを認識すると思われるのはなぜですか?

.msiインストーラーのWiXコードは次のとおりです。

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='htp://schemas.Microsoft.com/wix/2006/wi' >

  <!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE -->

  <Product Id='A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8' Language='2057' 
           Manufacturer='COMPANYNAME IT-Operations' 
           Name='COMPANYNAMEServerListener' Version='1.0.0' 
           UpgradeCode='PUT-GUID-HERE'>

   <Package Id='*' Manufacturer='COMPANYNAME IT-Operations' Compressed='yes' />
   <Media Id='1' Cabinet='COMPANYNAMEServerListener.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
      <Directory Id='COMPANYNAME' Name='COMPANYNAME'>
        <Directory Id='INSTALLDIR' Name='COMPANYNAMEServerListener'>
        <Component Id='MainExecutable' Guid='*' >
          <File Id='COMPANYNAMEServerListener.exe' 
                Source='COMPANYNAMEServerListener.exe' Vital='yes' 
                KeyPath='yes' />
          <ServiceInstall 
            Id='COMPANYNAMEServerListenerInstall'
            DisplayName='COMPANYNAMEServerListener'
            Description='Accepts and discards TCP connections on port 28028 to indicate that this server is alive and ready to be controlled'
            Name='COMPANYNAMEServerListener'
            Account='NT AUTHORITY\LocalService'
            ErrorControl='normal'
            Start='auto'
            Type='ownProcess'
            Vital='yes'           
          >
            <ServiceDependency Id='tcpip'/>
          </ServiceInstall>
          <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="COMPANYNAMEServerListener" Wait="yes" />
        </Component>
        </Directory>
        </Directory>
      </Directory>
      </Directory>

    <Feature Id='Complete' Level='1' >
      <ComponentRef Id='MainExecutable' />
    </Feature>

    <CustomTable Id ="COMPANYNAMEMetadata">
      <Column Id="Property" Type="string" Category="Identifier" PrimaryKey="yes"/>
      <Column Id="Value" Type="string"/>
      <Row>
      <Data Column="Property">InstallString</Data>
      <Data Column="Value">/qn</Data>
      </Row>
    </CustomTable>


  </Product>
</Wix>
25
snoweagle

助けてくれてありがとう-それはWiXの問題であることが判明しました。

製品ID GUIDが質問のように明示的かつハードコードされたままの場合、結果の.msiにはProductCodeプロパティがなく、orcaで検査した場合に製品IDプロパティがありました。

GUIDを '*'に自動生成するように変更すると、ProductCodeが表示され、他の回答で確認された構文ですべて正常に動作します。

0
snoweagle

"Reference-Style" Answer:これは、いくつかの異なるオプションを備えた以下の代替案です示されています。 msiexecを使用せずにコマンドラインからMSIファイルをアンインストールする


指定するコマンドは正しいです:msiexec/x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

このアクションは現在インストールされている製品にのみ有効です」を取得した場合、認識されていない製品またはパッケージコードを使用したため、正しいものを見つける必要があります。多くの場合、これは製品コードの代わりに誤ったパッケージコードを使用することによって引き起こされる可能性があります-)アンインストールする-MSIファイルを再構築するたびにパッケージコードが変更され、msiファイルのプロパティページを表示するときに表示される唯一のガイドです。適切なものを使用すれば、アンインストールでも機能するはずです。エラーの余地はありません。代わりに製品コードを検索する場合は、MSIを開く必要があります。製品コードはPropertyテーブルにあります。


2018年1月更新

すべてのレジストリリダイレクトが進行しているため、以下のレジストリベースのアプローチが実行可能なオプションであるかどうかはわかりません。 PowerShellを使用した次のアプローチに依存しているため、適切にチェックしていません。 製品を見つける方法GUIDインストールされたMSIセットアップの?

また、MSIパッケージをアンインストールするさまざまな方法と、インストールした製品バージョンを判断する方法を説明するこの参照スタイルの回答も確認してください。 msiexecを使用せずにコマンドラインからMSIファイルをアンインストールする


レガシー、レジストリオプション

このベースからregistryを熟読することにより、製品コードを見つけることもできますキー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall F3を押して、製品名を検索します。 (64ビットマシン上の32ビットインストーラーの場合、代わりにHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstallにあります)。

レガシー、PowerShellオプション:(上記のリンクされた新しい回答にほぼ類似)

最後に、PowerShellを使用して製品コードを見つけることができます。

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name

enter image description here

同様の投稿: WiX-マルチインスタンスインストールでメジャーアップグレードを行う (MSIで製品コードを見つける方法のスクリーンショット)。

33
Stein Åsmul

良いことは、これは本当に簡単かつ決定論的に分析することです:msiパッケージが実際にシステムにインストールされていないか、何か間違っていることです。もちろん、正しい呼び出しは次のとおりです。

msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

(もちろん、管理者権限が必要です-引用符なしの中括弧付き-コマンドラインで空白のパスまたは値が指定されている場合のみ、引用符が必要です。)
メッセージが「このアクションは、現在インストールされている製品にのみ有効です」の場合、これは事実です。このProductCodeを持つパッケージがインストールされていないか、タイプミスがあります。

障害の場所を確認するには:

  1. 最初に、(おそらく)インストールされている.msiファイル自体を右クリックしてみてください。 (「インストール」と「修復」以外に)アンインストールエントリが表示されます。それをクリックしてください。

    ].

  2. 1.a)が当てはまる場合、Orca、Instedまたは別のエディター/ツールでmsiファイルを開くと、パッケージの正しいProductCodeを検索できます。彼らのためだけにグーグル。 「Property」という名前のテーブルを見て、最初の列で「ProductCode」という文字列を検索します。 2列目には正しい値があります。

他の可能性はありません。

使用するコマンドラインの提案:単純なプログレスバーに「/ qb」または「/ qn」パラメーターを追加します(後者は完全なサイレントアンインストールに使用しますが、動作することが確実な場合にのみ意味があります)。

3
Philm

msiexec.exe/x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}"/q

3
suhail sayyad

{}コマンドが機能しない理由はありません。半自明な質問は次のとおりです。

  1. 製品が実際にインストールされていることを確認してください! ARP/Programs&Featuresに何かがあります。

  2. 実際には、元のインストールは現在のコンテキストで表示されます。ユーザーごとのインストールであるかのように見えます。また、他のユーザーとしてログインしている場合、そのことを認識しません。元のインストールと同じアカウントでログインする必要があります。

  3. \ windows\installerディレクトリが破損している場合、キャッシュファイルは失われ、アンインストールの実行に使用されます。

2
PhilDW

このコマンドを試してくださいmsiexec/x {product-id}/qr

0
Sushant Saurabh

最後に/ qが必要です

MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q
0
TheBitBucket