2017-04-13 1 views
0

이 작은 nsis 설치 프로그램에서 내부적으로 errorlevel을 설정하고 (설치 스크립트/자동 설치기를 배치 스크립트 내에서 자동 실행 모드로 실행할 때) 외부에서 잡으려고합니다. 그러나 어떻게 든 항상 % errorlevel % = 여기에 0NSIS 자동 설치 제거 SetErrorLevel

!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 

그것에 뭔가 잘못인가 내 NSI 스크립트입니다? "HKLM \ 소프트웨어 \의 $ {MY_APP_NAME}"설치 후, 나는 의도적으로 레지스트리 키를 삭제 : 내가 예를 들어 %의 오류 수준의 % = 1

SetErrorLevel 1 
Quit 

이 있어야합니다 (오류의 경우) 그 라인을 함께 생각 , 그리고 나서 제거 프로그램을 실행합니다. 키를 찾지 못하고 예상대로 종료되지만 % errorlevel %는 여전히 0입니다.

답변

1

설치 관리자가 코드를 예상대로 설정해야합니다.

제거 프로그램이 %temp%에서 자신의 복사본을 실행하여 $Instdir에서 자신을 삭제할 수 있도록합니다. 이것이 실패하면 0이 아닌 종료 코드를 설정하지만 다른 제거 프로그램 인스턴스를 기다리지 않고 실제 종료 코드를보고합니다.

documented _?= 스위치를 사용하여 제거 프로그램을 실행하여 복사 단계를 건너 뛸 수 있지만 수동으로 제거 프로그램 .exe를 삭제해야합니다.

_? =는 $ INSTDIR을 설정합니다. 또한 제거 프로그램이 임시 디렉토리에 자신을 복사하고 거기에서 실행하는 것을 중지합니다. ExecWait과 함께 사용하여 제거 프로그램이 끝날 때까지 기다릴 수 있습니다. 명령 행에 마지막으로 사용 된 매개 변수 여야하며 경로에 공백이 포함되어 있어도 따옴표가 없어야합니다.

관련 문제