2017-04-13 3 views
0

In diesem kleinen nsis Installer möchte ich intern den Errorlevel setzen und extern fangen (wenn ich den Installer/Uninstaller im Silent-Modus innerhalb eines Batch-Skripts starte), aber irgendwie bekomme ich immer% errorlevel% = 0.NSIS stille Deinstallation SetErrorLevel

Hier ist mein NSI Skript

!addincludedir .\include 
!include StrRep.nsh 
!include ReplaceInFile.nsh 


!include LogicLib.nsh 


!include FileFunc.nsh 
!insertmacro GetParameters 
!insertmacro GetOptions 


!define MY_APP_NAME "foo" 

Outfile "${MY_APP_NAME}.exe" 

InstallDir $DESKTOP 


Section 

    ${GetParameters} $R0 


    ClearErrors 
    ${GetOptions} $R0 /PLACEHOLDER= $0 

    IfErrors 0 +2 
    Call ErrorHandler 

    SetOutPath $INSTDIR 


    File /r foo_root_folder 

    !insertmacro _ReplaceInFile "foo_root_folder\subfolder_a\test.properties" "%%placeholder_string%%" "$0" 


    WriteRegStr HKLM "SOFTWARE\${MY_APP_NAME}" "Install_Dir" "$INSTDIR\foo_root_folder" 


    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "Publisher" "Federico" 
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "DisplayName" "${MY_APP_NAME}" 
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "DisplayVersion" "1.0" 
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "UninstallString" '"$INSTDIR\foo_root_folder\uninstall.exe"' 
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "NoModify" 1 
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "NoRepair" 1 
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" "EstimatedSize" 1000 
    WriteUninstaller "foo_root_folder\uninstall.exe" 



SectionEnd 

Section "Uninstall" 

    ReadRegStr $0 HKLM "SOFTWARE\${MY_APP_NAME}" "Install_Dir" 

    ${If} ${Errors} 
    Call un.ErrorHandler 
    ${Else} 
    ${IF} $0 == "" 
       Call un.ErrorHandler 
      ${ELSE} 


      DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${MY_APP_NAME}" 
      DeleteRegKey HKLM "SOFTWARE\${MY_APP_NAME}" 


      RmDir /r /REBOOTOK "$0" 
      ${ENDIF} 
    ${EndIf} 


SectionEnd 



Function ErrorHandler 
    SetErrorLevel 1 
    Quit 

FunctionEnd 


Function un.ErrorHandler 
    SetErrorLevel 1 
    Quit 

FunctionEnd 

ist etwas falsch daran? Ich denke, dass mit diesen Zeilen (im Fehlerfall) Ich sollte% Errorlevel% = 1

SetErrorLevel 1 
Quit 

Zum Beispiel haben: nach der Installation, ich absichtlich den Registrierungsschlüssel „HKLM \ SOFTWARE \ $ {MY_APP_NAME}“ löschen , und DANN das Deinstallationsprogramm ausführen. Es findet den Schlüssel nicht und wird wie erwartet beendet, aber der% errorlevel% ist immer noch 0

Antwort

1

Das Installationsprogramm sollte den Code wie erwartet festlegen.

Das Deinstallationsprogramm führt eine Kopie von sich in %temp% aus, damit es sich in $Instdir löschen kann. Wenn dies fehlschlägt, wird ein Beendigungscode ungleich null festgelegt, aber es wartet nicht auf die andere Deinstallationsprogramminstanz und meldet den tatsächlichen Beendigungscode.

Sie können das Deinstallationsprogramm mit dem Schalter ausführen, um den Kopierschritt zu überspringen, aber anschließend müssen Sie das Deinstallationsprogramm .exe manuell löschen.

_? = Setzt $ INSTDIR. Außerdem wird das Deinstallationsprogramm daran gehindert, sich selbst in das temporäre Verzeichnis zu kopieren und von dort zu starten. Es kann zusammen mit ExecWait verwendet werden, um auf das Beenden des Deinstallationsprogramms zu warten. Es muss der letzte in der Befehlszeile verwendete Parameter sein und darf keine Anführungszeichen enthalten, auch wenn der Pfad Leerzeichen enthält.