Search code examples
dialoginstallationnsissilent-installerunattended-processing

NSIS - Skip certain dialogs using command-line arguments?


Is there a way to make the NSIS installer skip certain dialogs?

It has these command-line arguments,

/S, /NCRC and /D=dir

Although /S and /NCRC can used for silent and unattended modes, is there are command-line arguments to make the installer skip certain dialogs in the installer and show the rest of the dialog? For example. skip the Welcome dialog and the next two dialogs and go to the fourth one.


Solution

  • /S, /NCRC and /D= are the only installer parameters with built-in support, anything else you have to handle yourself.

    Pages can be skipped by calling Abort in the page pre callback. It is also possible to jump forward a specific number of pages. The GetOptions macro can be used to parse the command line.

    OutFile Test.exe
    RequestExecutionLevel user
    InstallDir $Temp
    
    !include LogicLib.nsh
    !include FileFunc.nsh
    
    Page License LicPre
    Page Components CmpPre
    Page Directory "" DiShow
    Page InstFiles
    
    Var SkippedL
    Var SkippedC
    
    !macro AbortIfCmdlineParam Switch Var
    ${GetParameters} $0
    ClearErrors
    ${GetOptions} $0 "${Switch}" $0
    ${IfNot} ${Errors}
        ${If} ${Var} = 0
            StrCpy ${Var} 1
            Abort
        ${EndIf}
    ${EndIf}
    !macroend
    
    Function LicPre
    !insertmacro AbortIfCmdlineParam "/SkipL" $SkippedL
    FunctionEnd
    
    Function CmpPre
    !insertmacro AbortIfCmdlineParam "/SkipC" $SkippedC
    FunctionEnd
    
    Function DiShow
    # Disable back button if both pages skipped, this is optional
    ${If} $SkippedL <> 0
    ${AndIf} $SkippedC <> 0
        GetDlgItem $0 $hwndparent 3
        EnableWindow $0 0
    ${EndIf}
    FunctionEnd
    
    Section
    SectionEnd
    

    Run as Test /SkipL /SkipC to skip both.

    Or:

    OutFile Test.exe
    RequestExecutionLevel user
    InstallDir $Temp
    
    !include LogicLib.nsh
    !include FileFunc.nsh
    
    Page License "" LicShow
    Page Components
    Page Directory
    Page InstFiles
    
    Function LicShow
    Var /Global HasSkipped
    ${GetParameters} $0
    ClearErrors
    ${GetOptions} $0 "/Skip=" $0
    ${IfNot} ${Errors}
    ${AndIf} $0 < 4 ; Don't let user skip InstFiles
    ${AndIf} $HasSkipped = 0
        StrCpy $HasSkipped 1
        SendMessage $HWNDPARENT 0x408 $0 ""
    ${EndIf}
    FunctionEnd
    
    
    Section
    SectionEnd
    

    ...and run as Test /Skip=2.