Obtaining select command line parameters
From NSIS Wiki
Jump to navigationJump to search
Author: comperio (talk, contrib) |
The Script
/* This function will search for the requested command-line option and return the value. If the value is not found, the function returns an empty string. [USAGE] ${CMDPAR} [TAG] [Variable for result] [Tag] is a unique string to identify the parameter (ie "/B=", etc.) [Variable for result] is the variable in which to hold the result [RULES] - Each parameter value must start with the character indicated by PARAM_CHAR. - This function will not verify any parameter--this will be up to the script developer! - Parameters CANNOT be "nested" (a parameter within a parameter) - The function takes advantage of the StrCmp function, which is NOT case-sensative. (In other works "/l" and "/L" will be the same) - This function assumes that $CMDLINE will always have quotes around the actual SETUP.EXE file (example: "C:\my path\setup.exe" /b=parameter) - The return value will be trimmed automatically (no spaces at either end) [VARIABLES] $0 (str): string indicating the what the format of the command should be (example: "/B") $1 (int): Pointer value indicating the current position in the search string $2 (str): string value of the parameter portion of the command line $3 (str): Final value of the parameter (When $3=$0, stop copying the parameter to $R1) $4 (bln): A 1 or 0 value indicating when to start/stop adding characters to the parameter result (1 means start, 0 means stop) $5 (int): Total Length of the $CMDLINE variable, including the parameter part $6 (int): Single-character string of each character in the parameter field $R1 (str): Value of the requested parameter value $7 (int): Temporary variable for holding numbers */ !macro CMDPAR Tag OutVar Push ${TAG} Call GetParameters Pop ${OutVar} !macroend !define CMDPAR "!insertmacro CMDPAR" Function GetParameters ; all parameters must start with PARAM_CHAR. (Change value as needed.) !define PARAM_CHAR "/" Exch $0 ; $0 now contains the TAG string Push $R1 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 StrCpy $1 0 ; Initialize the pointer variable StrLen $5 $CMDLINE FindParam: ; Start loop to find the parameter portion of the $CMDLINE IntOp $1 $1 + 1 StrCpy $6 $CMDLINE 1 $1 StrCmp $6 '"' ExitFindParam 0 ; Exit the loop when the last quotes are found Goto FindParam ExitFindParam: IntOp $1 $1 + 2 ; Increment pointer one space to move it one character past the quotes IntOp $7 $5 - $1 ; Difference between total string length and the length of the parameter portion IntCmp $7 0 ParamDone ParamDone 0 ;If this value is zero, then no parameters have been defined (exit) ;MessageBox MB_YESNO|MB_ICONQUESTION "Difference between total string length and the length of the parameter portion: $7$\n$\r$\n$\rContinue?" IDNO ParamDone StrCpy $2 $CMDLINE $7 $1 ;MessageBox MB_OK "Parameter portion: [$2]" StrCpy $2 "X$2" ; Add one character to the start of the parameter string StrCpy $1 0 ; Reset the pointer StrCpy $4 0 ; keep characters from being copied to $R1 until we've found a match to the parameter tag FindParamValue: ;Start loop to find the requested parameter value IntOp $1 $1 + 1 strCpy $6 $2 1 $1 ;MessageBox MB_YESNO|MB_ICONQUESTION "Character value: [$6]$\r$\n$$PARAM_CHAR: [${PARAM_CHAR}]$\r$\nContinue?" IDNO PARAMDONE StrCmp $6 "" ParamDone 0 ;Exit if this is the end of the parameter string StrCmp $6 ${PARAM_CHAR} Reset4 NoReset4 ; Reset $4 if this is a new parameter Reset4: ;StrCpy $R1 "" StrCpy $4 0 StrCpy $3 "" NoReset4: StrCpy $3 "$3$6" IntCmp $4 0 NoBuildR1 BuildR1 BuildR1: StrCpy $R1 "$R1$6" NoBuildR1: ;MessageBox MB_YESNO|MB_ICONQUESTION "$$3: [$3]$\r$\n$$0: [$0]$\r$\n$\r$\nContinue?" IDNO PARAMDONE StrCmp $3 $0 0 FindParamValue StrCpy $4 1 Goto FindParamValue ParamDone: ; This last part of the script will trim the spaces off either end of $R1: StrCpy $2 "X$R1" strCpy $R1 "" StrCpy $1 0 KeepTrimming: IntOp $1 $1 + 1 strCpy $6 $2 1 $1 StrCmp $6 "" DoneTrimming 0 strCmp $6 " " NoCopyCharR1 CopyCharR1 copyCharR1: StrCpy $R1 "$R1$6" Goto KeepTrimming NoCopyCharR1: Goto KeepTrimming DoneTrimming: Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Push $R1 !undef PARAM_CHAR FunctionEnd