Ich benutze NSIS, um ein Installationsprogramm für ein Programm zu erstellen. Was ist der beste Weg, um festzustellen, ob dieses Programm bereits installiert ist? Kann ich das Installationsprogramm sofort beenden, wenn ich eine installierte Kopie ausfindig mache, da ich das Installationsprogramm von der autorun.inf ausführe? Gibt es einen besseren Weg, dies zu tun?Erkennen, ob ein Programm bereits mit NSIS installiert ist
Antwort
Wie wäre es damit. Ich hatte das in einem alten NSIS-Skript herumliegen.
; Check to see if already installed
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<YOUR-APP-NAME>" "UninstallString"
IfFileExists $R0 +1 NotInstalled
messagebox::show MB_DEFBUTTON4|MB_TOPMOST "<YOUR-APP-NAME>" \
"0,103" \
"<YOUR-APP-NAME> is already installed." \
"Launch Uninstall" "Cancel"
Pop $R1
StrCmp $R1 2 Quit +1
Exec $R0
Quit:
Quit
NotInstalled:
Dies wird in der Regel dadurch erreicht, dass NSIS bei der Installation einen Registrierungsschlüssel für Ihr Produkt einfügt. Es ist dann eine einfache Möglichkeit zu erkennen, ob dieser Registrierungsschlüssel vorhanden ist und wenn ja, Kaution
Irgendein Beispiel oder ein Zeiger, den Sie dazu geben können? –
Ich habe einen etwas anspruchsvolleren Test wurde mit der auch die Version der installierten Software überprüft:
!define PRODUCT_VERSION "1.2.0"
!include "WordFunc.nsh"
!insertmacro VersionCompare
Var UNINSTALL_OLD_VERSION
...
Section "Core System" CoreSystem
StrCmp $UNINSTALL_OLD_VERSION "" core.files
ExecWait '$UNINSTALL_OLD_VERSION'
core.files:
...
WriteRegStr HKLM "Software\${PRODUCT_REG_KEY}" "" $INSTDIR
WriteRegStr HKLM "Software\${PRODUCT_REG_KEY}" "Version" "${PRODUCT_VERSION}"
...
SectionEnd
...
Function .onInit
;Check earlier installation
ClearErrors
ReadRegStr $0 HKLM "Software\${PRODUCT_REG_KEY}" "Version"
IfErrors init.uninst ; older versions might not have "Version" string set
${VersionCompare} $0 ${PRODUCT_VERSION} $1
IntCmp $1 2 init.uninst
MessageBox MB_YESNO|MB_ICONQUESTION "${PRODUCT_NAME} version $0 seems to be already installed on your system.$\nWould you like to proceed with the installation of version ${PRODUCT_VERSION}?" \
IDYES init.uninst
Quit
init.uninst:
ClearErrors
ReadRegStr $0 HKLM "Software\${PRODUCT_REG_KEY}" ""
IfErrors init.done
StrCpy $UNINSTALL_OLD_VERSION '"$0\uninstall.exe" /S _?=$0'
init.done:
FunctionEnd
Sie natürlich in den Details zu füllen haben, das gibt Ihnen nur eine grobe Skelett.
Nach dem Erstellen Ihres Uninstaller einen Produktnamen ein Eintrag in der Registry erstellen
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANY_NAME} ${PRODUCT_NAME}"
Section -Post
SetShellVarContext current
WriteUninstaller "${UNINST_PATH}\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
Um zu sehen, ob das Produkt nicht installiert ist
Function IsProductInstalled
ClearErrors
ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName"
StrCmp $2 "" exit
In Ihrem deinstallieren Sie tun sollten
Section Uninstall
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
- 1. Erkennen, ob Mod_Security mit PHP installiert ist?
- 2. Erkennen, ob das .NET-Familienupdate installiert ist
- 3. Erkennen, ob eine Oracle-Datenbank installiert ist
- 4. Wie überprüft man, ob ein Programm unter Windows installiert ist
- 5. INNO-Setup-Treiber bereits installiert
- 6. Wie erkennen, ob Java-Laufzeit installiert ist oder nicht
- 7. Erkennen, ob eine Datei in Javascript bereits geöffnet ist
- 8. Finden Sie Programm ist installiert oder nicht
- 9. Erkennen, ob eine Datei bereits in Javascript geöffnet ist/hta
- 10. Programmgesteuert erkennen, ob eine App auf dem iPhone installiert ist
- 11. Erkennen, ob eine Anwendung installiert ist oder nicht?
- 12. Erkennen, ob WinHelp auf Vista oder neuer installiert ist Windows
- 13. Wie kann ich erkennen, ob docker für Mac installiert ist?
- 14. Erkennen, ob das Compact Framewok auf dem Mobilgerät installiert ist
- 15. Verwenden von C# Erkennen, ob Windows Installer 4.5 installiert ist
- 16. Erkennen, ob eine andere Chrome-Erweiterung installiert ist
- 17. Wissen, ob ein Dienst installiert ist
- 18. überprüfen, ob ein Benutzer bereits angemeldet ist?
- 19. Überprüfen, ob ein Paket installiert ist
- 20. Wie überprüfe ich mit C#, wo ein Programm installiert ist
- 21. erkennen, ob ein Programm über die Eingabeaufforderung ausgeführt wird
- 22. Erkennen, ob ein HttpModule geladen ist
- 23. Überprüfen, ob ein Port unter FreeBSD installiert ist
- 24. Test, ob ein ActiveX-Steuerelement mit Javascript installiert ist?
- 25. Erkennen, ob Datei in C++ geöffnet ist
- 26. Erkennen des Emacs-Fensters ist bereits aufgeteilt
- 27. socket.io-Client: Wie wird festgestellt, ob ein Handler bereits installiert ist?
- 28. Erkennen, ob Flash auf Android installiert ist und ein Flash-Video in eine Aktivität einbetten
- 29. Prüfung, ob ein Programm installiert ist, für einen bestimmten PHP-Skript PHP
- 30. Überprüfen Sie, ob der Benutzer bereits mit Auth.GoogleSignInApi angemeldet ist.
Sie erwähnten Launch Uninstall. Ich konnte Deinstallation in meinem .nsi-Skript nicht wirklich aufrufen, indem Sie diesen obigen Code verwenden. Können Sie mir sagen, wie kann ich Uninstall aufrufen, wenn mein Programm bereits installiert ist? – Jango
Ich musste die 'messagebox :: show' Zeile zu' MessageBox MB_YESNO 'ändern. $ {YOUR_APP_NAME} ist bereits installiert. Deinstallieren Sie die bestehende Version? "/SD IDYES IDNO Beenden '. –
Es ist nicht immer wahr. Einige Software hat unter Deinstallation keinen direkten, zB Visual C++ redistributable. In solchen Fällen müssen wir möglicherweise unter Uninstall alle Schlüssel durchlaufen und die Wertdaten des Wertnamens "DisplayName" prüfen. –
Yorkwar