Код:
; Создадим константу, которая содержит Путь установки по умолчанию
!define DEFAULT_DIR_INST "$PROGRAMFILES\SomeProgDir"
; Запишем её в атрибут InstallDir. Это будет наш $INSTDIR по умолчанию
InstallDir "${DEFAULT_DIR_INST}"
...
Var commandline ; переменная для считывания командной строки
Var i_CommandlineSetDir ; переменная для хранения состояния "путь взят из командной строки" да=1, нет=0
...
Function .onInit
; Установим переменную в ноль (путь с командной строки не считывался)
StrCpy $i_CommandlineSetDir 0
${GetParameters} $commandline
; Если путь установки, сохранённый в установщике (в ${DEFAULT_DIR_INST}) не совпадает с текущим $INSTDIR,
; значит использовался NSIS параметр /D=
${If} "$INSTDIR" != "${DEFAULT_DIR_INST}"
StrCpy $i_CommandlineSetDir 1 ; установим в единицу, т.е. путь взят из командной строки
${EndIf}
...
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors} ; проверка ключа /P
${If} $i_CommandlineSetDir = 0 ; если путь не взят из командной строки
StrCpy $INSTDIR "$EXEDIR\${APP} Portable" ; меняем его на свой
${EndIf}
${EndIf}
...
FunctionEnd