2009-04-05 32 views
9

Tôi vừa bắt đầu sử dụng NSIS.
Nó hoạt động rất tốt nhưng tôi tìm thấy tài liệu một chút không có cấu trúc. Làm cách nào để yêu cầu người dùng gỡ cài đặt phiên bản trước đó trước khi cài đặt phiên bản mới với NSIS?Làm cách nào để yêu cầu người dùng gỡ cài đặt phiên bản trước đó với NSIS

NSIS (Hệ thống cài đặt có thể cài đặt Nullsoft) là hệ thống nguồn mở để tạo trình cài đặt Windows.

Trả lời

13

NSIS là trình cài đặt Windows tuyệt vời. Đây là cách tôi sử dụng NSIS để gỡ cài đặt phiên bản hiện tại trong khi cài đặt phiên bản mới của cùng một ứng dụng. Thêm chức năng sau vào tập lệnh NSIS của bạn.

Function .onInit 

     Exec $INSTDIR\uninst.exe 

FunctionEnd 

Ngoài ra, bạn có thể xem liên kết this trên wiki NSIS về "Tự động gỡ cài đặt cũ trước khi cài đặt mới".

+1

+1 cho liên kết –

+2

Không sử dụng $ INSTDIR. Sử dụng giá trị bạn đọc từ sổ đăng ký để đảm bảo rằng giá trị đó là đúng. – utapyngo

13

Cách tiếp cận khác là tạo một phần ẩn UninstallPrevious và làm cho nó chạy trước tất cả các phần khác trong trình cài đặt. Tôi cũng khuyên bạn nên làm cho trình gỡ cài đặt chạy âm thầm.

; The "" makes the section hidden. 
Section "" SecUninstallPrevious 

    Call UninstallPrevious 

SectionEnd 

Function UninstallPrevious 

    ; Check for uninstaller. 
    ReadRegStr $R0 HKLM "${HKLM_REG_KEY}" "InstallDir" 

    ${If} $R0 == ""   
     Goto Done 
    ${EndIf} 

    DetailPrint "Removing previous installation."  

    ; Run the uninstaller silently. 
    ExecWait '"$R0\Uninstall.exe /S"' 

    Done: 

FunctionEnd 

Ưu điểm của phương pháp này là người dùng sẽ không gỡ cài đặt phiên bản cũ cho đến khi họ sẵn sàng cài đặt phiên bản mới. Hơn nữa, họ thậm chí không phải đưa ra quyết định về việc gỡ cài đặt phiên bản cũ, nó chỉ biến mất một cách kỳ diệu.

Tất nhiên, tùy theo nhu cầu của bạn, bạn có thể muốn người dùng xác nhận gỡ cài đặt, trong trường hợp đó sử dụng phương pháp của spinner_den.

+1

Khi bạn nhận dữ liệu vào '$ R0', bạn có nên sử dụng nó trong' ExecWait' không? – svrist

+0

Tôi đã viết rằng 2 năm trước, nhưng có, có vẻ đúng. – cdmckay

1

Tôi sử dụng lại các khóa đăng ký UninstallString hoặc QuietUninstallString được viết trong quá trình cài đặt để sau đó xác định lệnh trình gỡ cài đặt.

Một vài định nghĩa ở đầu trang:

!define PROJECT_REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROJECT_NAME}" 
!define PROJECT_UNINSTALL_EXE "uninstall.exe" 

Trong bộ cài đặt Section:

WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" _?=$INSTDIR' 
WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" /S _?=$INSTDIR' 

Và sau đó trong .onInit lấy bạn đăng ký giá trị quan trọng (sẽ tồn tại nếu ứng dụng của bạn đã được cài đặt này cách) và chạy nó:

${If} ${Silent} 
    ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" 
${Else} 
    ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" 
${EndIf} 
ExecWait "$R0" 
Các vấn đề liên quan