2013-05-30 78 views
1

我正在运行使用NSIS完成的程序安装程序,但/ D选项似乎无法正常工作(或更好地在内部重写)。 通过命令行我触发:NSIS无声安装程序路径覆盖

installer.exe /S /D=C:\Users\Public\installDir 

NSIS代码是:

InstallDir "C:\Users\Public\${VERSIONSTR}" 


Function xxxx 
${If} $MultiUser.InstallMode == "AllUsers"  
StrCpy $INSTDIR "C:\Users\Public\Dir1" 
${EndIf} 
IfSilent 0 +20 
    StrCpy $INSTDIR "C:\Userdata\Dir2" 
FunctionEnd 

所使用的安装文件夹是 “C:\用户\公共\方向2”。即使我评论IfSilent块,installtion文件夹将是“C:\ Users \ Public \ Dir1”,但绝不会是通过命令行传递的。 我的脚本有什么问题?

+1

当心你的'IfSilent 0 + 20'的:它应该是'+ 2',不'+ 20' – Seki

+0

你确定你在你的函数XXXX和/或使用'$ INSTDIR'是通之后不会重写? – Seki

+0

是的,我在这个函数里面传递,因为路径是根据它写在里面的。我也没有看到有可能重写它,但可能是我的失踪。我必须寻找什么? – user2435588

回答

2
!include LogicLib.nsh 
;InstallDir ; Do not use InstallDir at all so we can detect empty $InstDir 
!define DEFDIR_MACHINE "$programfiles\foo" 
!define DEFDIR_PERUSER "$localappdata\bar" 
Function .onInit 
${If} $InstDir == "" ; /D not used 
    ${If} $MultiUser.InstallMode == "AllUsers" 
     StrCpy $InstDir "${DEFDIR_MACHINE}" 
    ${Else} 
     StrCpy $InstDir "${DEFDIR_PERUSER}" 
    ${EndIf} 
    ${If} ${Silent} 
     StrCpy $InstDir "c:\CrazySilentOverride" 
    ${EndIf} 
${EndIf} 
FunctionEnd