2010-10-19 12 views
12

Chúng tôi cài đặt một ứng dụng (MSI) sử dụng MSIEXEC với các tùy chọn dòng lệnh sau:MSI Install Thất bại vì "Một phiên bản của sản phẩm này đã được cài đặt"

MsiExec.exe /x{code} /qn /liwearucmopvx+ C:\Log\UnInstall.tra 
MsiExec.exe /iC:\Source\App.msi /qn TARGETDIR=C:\Install ALLUSERS=1 /liwearucmopvx+ %C:\Log\Install.tra 

Phần lớn thời gian làm việc này, nhưng đôi khi gỡ cài đặt không thành công (không chắc chắn tại sao, hãy xem lỗi). Dù sao khi điều này xảy ra tôi nhận được lỗi sau trong khi cài đặt lại:

Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel 

Có cách nào để bỏ qua điều này không? Có nghĩa là để đảm bảo rằng chúng tôi luôn cài đặt lại (nếu nó tồn tại, chúng tôi có thể tự động thổi nó đi?)

+0

Bạn đang làm chương trình MsiExec? Hoặc câu hỏi này thuộc về một nơi khác ;-) –

+0

Bạn không chắc chắn ý của mình là "làm cho chương trình" là gì? – Shaitan00

+0

stackoverflow như tên (có thể) ngụ ý là một trang web lập trình viên, AFAIK. –

Trả lời

0

Nếu việc gỡ cài đặt không thành công sẽ vẫn được đăng ký trên hệ thống - tùy thuộc vào nơi xảy ra lỗi, quá trình gỡ cài đặt sẽ được khôi phục , để sản phẩm vẫn được cài đặt.

Nếu bạn cố gắng cài đặt lại sản phẩm có cùng mã sản phẩm nhưng phiên bản khác với cài đặt hiện tại MSI sẽ khiếu nại, đúng là sản phẩm vẫn được cài đặt. Nếu bạn muốn đạt được hành vi nâng cấp thì bạn cần thay đổi mã sản phẩm và ghi các mục vào bảng nâng cấp để MSI có thể phân biệt giữa sản phẩm cũ và mới và sử dụng hành động RemoveExistingProducts để xóa sản phẩm cũ trước hoặc sau phiên bản mới hơn nằm xuống.

Nếu bạn muốn hiểu tại sao quá trình gỡ cài đặt không thành công, bạn cần xem nhật ký, thường tìm 'giá trị trả lại 3' là chữ ký của hành động cài đặt không thành công.

8

Kiểm tra MSDN Documentation on the Upgrade Table, về cơ bản bạn cần phải đặt các bit msidbUpgradeAttributesVersionMaxInclusive bit.

Bạn không nói những gì bạn đang sử dụng để xây dựng trình cài đặt, nếu bạn đang sử dụng WiX 3.5 hoặc cao hơn, bạn có thể sử dụng MajorUpgrade/@AllowSameVersionUpgrades="yes" để xử lý việc này cho bạn.

Note that because MSI ignores the fourth product version field, setting this attribute to yes also allows downgrades when the first three product version fields are identical. For example, product version 1.0.0.1 will "upgrade" 1.0.0.2998 because they're seen as the same version (1.0.0). That could reintroduce serious bugs so the safest choice is to change the first three version fields and omit this attribute to get the default of no.

Lưu ý rằng thay vì phải nhớ mã gói (một nỗi đau thực sự nếu bạn đang sử dụng mã gói tự động được tạo ra với hội nhập liên tục) VBScript sau đây sẽ loại bỏ các gói bằng tên bằng cách tìm kiếm danh sách các sản phẩm được cài đặt và tự tìm mã gói.

Option Explicit 
Dim productName, productCode, installer 
productName = "My Application" 

Set installer = Wscript.CreateObject("WindowsInstaller.Installer") 

For Each productCode In installer.Products 
    If InStr(1, LCase(installer.ProductInfo(productCode, "ProductName")), LCase(productName)) Then Exit For 
Next 

If Not IsEmpty(productCode) Then  
    Dim WshShell, oExec 
    Set WshShell = CreateObject("WScript.Shell") 
    Set oExec = WshShell.Exec("msiexec /x " & productCode & " /qb /l*v ""%temp%\UninstallApp.log"" ") 
End If 
+0

Cài đặt này đã thực hiện trình cài đặt thử nghiệm có thể tự khắc phục để tôi có thể gỡ cài đặt thành công nó. –

0

Câu hỏi đặt ra là khá cũ, nhưng câu trả lời hiện đang thiếu bản chất của vấn đề và giải pháp trong khi hữu ích cho các kịch bản khác:

  1. Nếu gỡ bỏ cài đặt không, bạn có một vấn đề nghiêm trọng và không có cách nào tốt hơn là phân tích điều này- nếu không bạn có thể gặp rắc rối sau.

  2. Ít nhất, tôi sẽ viết một tập lệnh/chương trình nhỏ, sử dụng giá trị trả về của quá trình gỡ cài đặt hoặc thậm chí mạnh hơn, nếu MSI vẫn được cài đặt- TRƯỚC KHI bạn thử cài đặt MSI mới.
    Tôi sẽ cung cấp thêm thông tin về cách thực hiện việc này, nếu có sự quan tâm đến điều này, nhưng đã có thông tin về SO trong các câu hỏi khác.

  3. Một số câu trả lời khác được đề xuất, bạn nên sử dụng Nâng cấp chính (mỗi bản dựng mới có thể/phải là Nâng cấp chính chính xác trong trường hợp này, ít nhất là đề xuất). Đây là một khuyến nghị tốt, nhưng không giúp được gì, nếu các lần gỡ cài đặt thất bại "đôi khi". Hơn nữa, điều quan trọng là phải nêu rõ, thường xuyên nhất là lỗi bạn đề cập đến, cho thấy bạn hiện không sử dụng các Nâng cấp chính. Nếu bạn có vấn đề với việc gỡ cài đặt, thì Nâng cấp chính có thể làm tăng sự cố, vì phụ thuộc vào cấu hình, nó có thể cài đặt sản phẩm lần thứ hai MSI-khôn ngoan và bạn có hai tài liệu tham khảo MSI về điều này, vẫn là một sản phẩm cho bạn. Thêm chi tiết sẽ dẫn quá xa. Chỉ cần nhớ, một (luôn luôn) làm việc gỡ cài đặt hoặc ít nhất một thử nghiệm cho điều này đã được đảm bảo trước khi các bước cập nhật thêm.

  4. Tập lệnh từ saschabeaumont thực sự ngắn và đẹp. Những gì nó đang làm, là để đảm bảo, rằng bạn đang thực sự sử dụng đúng ProductCode. Nhu cầu chính là, bởi vì nó có thay đổi mọi thời gian, bạn tạo ra một nâng cấp lớn ... Trong trường hợp của bạn: Điều này giải quyết chỉ ONE kịch bản, tại sao gỡ bỏ cài đặt của bạn có thể đã thất bại ...