!include FileFunc.nsh !include UAC.nsh !define FOLDERID_UserProgramFiles {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} !define KF_FLAG_CREATE 0x00008000 # allow user to define own custom !define /ifndef INSTALL_REGISTRY_KEY "Software\${APP_GUID}" !define /ifndef UNINSTALL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}" # current Install Mode ("all" or "CurrentUser") Var installMode !ifndef INSTALL_MODE_PER_ALL_USERS !ifndef ONE_CLICK Var hasPerUserInstallation Var hasPerMachineInstallation !endif Var PerUserInstallationFolder !macro setInstallModePerUser StrCpy $installMode CurrentUser SetShellVarContext current # сhecks registry for previous installation path ReadRegStr $perUserInstallationFolder HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation ${if} $perUserInstallationFolder != "" StrCpy $INSTDIR $perUserInstallationFolder ${else} StrCpy $0 "$LocalAppData\Programs" System::Store S # Win7 has a per-user programfiles known folder and this can be a non-default location System::Call 'SHELL32::SHGetKnownFolderPath(g "${FOLDERID_UserProgramFiles}", i ${KF_FLAG_CREATE}, p 0, *p .r2)i.r1' ${If} $1 == 0 System::Call '*$2(&w${NSIS_MAX_STRLEN} .s)' StrCpy $0 $1 System::Call 'OLE32::CoTaskMemFree(p r2)' ${endif} System::Store L StrCpy $INSTDIR "$0\${APP_FILENAME}" ${endif} # allow /D switch to override installation path https://github.com/electron-userland/electron-builder/issues/1551 !insertmacro GetDParameter $R0 ${If} $R0 != "" StrCpy $INSTDIR $R0 ${endif} !macroend !endif !ifdef INSTALL_MODE_PER_ALL_USERS_REQUIRED Var perMachineInstallationFolder !macro setInstallModePerAllUsers StrCpy $installMode all SetShellVarContext all !ifdef BUILD_UNINSTALLER ${IfNot} ${UAC_IsAdmin} ShowWindow $HWNDPARENT ${SW_HIDE} !insertmacro UAC_RunElevated Quit ${endif} !endif # сheck registry for previous installation path ReadRegStr $perMachineInstallationFolder HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation ${if} $perMachineInstallationFolder != "" StrCpy $INSTDIR $perMachineInstallationFolder ${else} StrCpy $0 "$PROGRAMFILES" !ifdef APP_64 ${if} ${RunningX64} StrCpy $0 "$PROGRAMFILES64" ${endif} !endif !ifdef MENU_FILENAME StrCpy $0 "$0\${MENU_FILENAME}" !endif StrCpy $INSTDIR "$0\${APP_FILENAME}" ${endif} # allow /D switch to override installation path https://github.com/electron-userland/electron-builder/issues/1551 !insertmacro GetDParameter $R0 ${If} $R0 != "" StrCpy $INSTDIR $R0 ${endif} !macroend !endif # Custom function to handle /D parameter with spaces # The /D parameter is special in NSIS - it must be the last parameter and cannot have quotes # Use StdUtils.GetParameter to get the full command line, then parse /D= manually !macro GetDParameter outVar Push $R8 Push $R9 Push $R7 Push $R6 Push $R5 # Get the complete command line using StdUtils (including /D parameter) ${StdUtils.GetAllParameters} $R8 "0" # Initialize result StrCpy $R9 "" # Search for /D= or /d= using a simple loop StrLen $R7 $R8 IntOp $R7 $R7 - 2 # Don't check last 2 characters StrCpy $R6 0 ${Do} StrCpy $R5 $R8 3 $R6 # Get 3 characters starting at position $R6 ${If} $R5 == "/D=" ${OrIf} $R5 == "/d=" # Found /D= or /d=, extract everything after it IntOp $R6 $R6 + 3 StrCpy $R9 $R8 "" $R6 ${Break} ${EndIf} IntOp $R6 $R6 + 1 ${LoopUntil} $R6 > $R7 StrCpy ${outVar} $R9 Pop $R5 Pop $R6 Pop $R7 Pop $R9 Pop $R8 !macroend