5
A
回答
5
您可以使用special builds page中的替代NSIS版本,如large strings build定义NSIS_MAX_STRLEN=8192
,并应阻止您破坏主机路径。实际上,在桌面计算机上,1024字节似乎够用了,但是在安装了许多工具的开发主机上(如我的),路径可能会在操作后中断,而8192字节的字符串从未扰乱我的机器。
可以肯定的是,您可以在操作之前在路径长度上添加一个检查,并在路径接近常量NSIS_MAX_STRLEN
,然后尝试操纵它,然后用消息中止安装程序。
4
真正的解决办法是写一个自定义插件或直接与系统插件调用Windows API,因此可以避开NSIS缓冲区长度的限制:
!include LogicLib.nsh
!include WinCore.nsh
!ifndef NSIS_CHAR_SIZE
!define NSIS_CHAR_SIZE 1
!endif
Function RegAppendString
System::Store S
Pop $R0 ; append
Pop $R1 ; separator
Pop $R2 ; reg value
Pop $R3 ; reg path
Pop $R4 ; reg hkey
System::Call 'ADVAPI32::RegCreateKey(i$R4,tR3,*i.r1)i.r0'
${If} $0 = 0
System::Call 'ADVAPI32::RegQueryValueEx(ir1,tR2,i0,*i.r2,i0,*i0r3)i.r0'
${If} $0 <> 0
StrCpy $2 ${REG_SZ}
StrCpy $3 0
${EndIf}
StrLen $4 $R0
StrLen $5 $R1
IntOp $4 $4 + $5
IntOp $4 $4 + 1 ; For \0
!if ${NSIS_CHAR_SIZE} > 1
IntOp $4 $4 * ${NSIS_CHAR_SIZE}
!endif
IntOp $4 $4 + $3
System::Alloc $4
System::Call 'ADVAPI32::RegQueryValueEx(ir1,tR2,i0,i0,isr9,*ir4r4)i.r0'
${If} $0 = 0
${OrIf} $0 = ${ERROR_FILE_NOT_FOUND}
System::Call 'KERNEL32::lstrlen(t)(ir9)i.r0'
${If} $0 <> 0
System::Call 'KERNEL32::lstrcat(t)(ir9,tR1)'
${EndIf}
System::Call 'KERNEL32::lstrcat(t)(ir9,tR0)'
System::Call 'KERNEL32::lstrlen(t)(ir9)i.r0'
IntOp $0 $0 + 1
!if ${NSIS_CHAR_SIZE} > 1
IntOp $0 $0 * ${NSIS_CHAR_SIZE}
!endif
System::Call 'ADVAPI32::RegSetValueEx(ir1,tR2,i0,ir2,ir9,ir0)i.r0'
${EndIf}
System::Free $9
System::Call 'ADVAPI32::RegCloseKey(ir1)'
${EndIf}
Push $0
System::Store L
FunctionEnd
Section
Push ${HKEY_CURRENT_USER}
Push "Environment"
Push "Path"
Push ";"
Push "c:\whatever"
Call RegAppendString
Pop $0
DetailPrint RegAppendString:Error=$0
SectionEnd
0
我已经写了NSIS 3.0例子来处理案件超过限制,无需安装任何东西。回答了这个问题在这里:Set environment variables with NSIS in Window 7
1
我更喜欢通过NSIS nsExec::Exec
命令,它允许你要追加到PATH
容易,像这样使用Windows命令处理器(cmd.exe
):
; Check if the path entry already exists and write result to $0
nsExec::Exec 'echo %PATH% | find "c:\some\new\dir"'
Pop $0 ; gets result code
${If} $0 = 0
nsExec::Exec 'set PATH=%PATH%;c:\some\new\dir'
${EndIf}
使用这种方法,CMD.EXE
扩张内部变量PATH
,不受任何NSIS字符串长度限制的影响。
nsExec::Exec 'set PATH=c:\some\new\dir;%PATH%'
还要注意的是:另外,如果你想被拾起你的程序第一,任何事情和其他一切可能对系统由同名安装提前改变%PATH%
标记粘贴顺序不包括双引号,而建设新PATH
是很重要的。命令处理器从不期望PATH字符串中的双引号,如果添加任何内容,可能会以意想不到的方式运行。它仅用分号(;
)分隔路径。
nsExec::Exec
从ExecWait
不同之处在于它在内部运行,没有弹出额外可见命令提示符窗口。
相关问题
- 1. setenv()更新PATH环境变量
- 2. NSIS不看环境变量
- 3. 更改MAMP中的PATH环境变量
- 4. Path环境变量14.04
- 5. 使用源更新bash环境变量
- 6. 环境变量不更新
- 7. 更新PATH环境变量会停止Eclipse的工作
- 8. 在Dockerfile中,如何更新PATH环境变量?
- 9. 带有环境变量的NSIS CreateShortcut
- 10. 更新PATH环境变量独立于使用JAVA的操作系统
- 11. 测试路径和PATH环境变量
- 12. Visual Studio Solution Path环境变量
- 13. 特定于Python的PATH环境变量?
- 14. 添加目录到PATH环境变量
- 15. 带PATH环境变量的File.Open()
- 16. 的Process.Start()和PATH环境变量
- 17. 环境变量的顺序%PATH%
- 18. 工头和PATH环境变量
- 19. linux中的PATH环境变量
- 20. python中的PATH环境变量
- 21. Dockerfile忽略PATH环境变量
- 22. UNIX PATH环境变量编辑
- 23. $ mac上的apache2的PATH环境变量
- 24. Windows 7的PATH环境变量扩展
- 25. 记事本++ PATH环境变量
- 26. Android中的PATH环境变量
- 27. 无法设置Python环境PATH变量?
- 28. 用QProcessEnvironment更改cmd.exe的PATH环境变量
- 29. 在Windows 7中使用NSIS设置环境变量
- 30. Visual Studio中自定义Python环境中的PATH环境变量已更改
我只是做对RegAppendString功能轻微的测试,最好你将迫使零终止,检查它是否已经在最后的分离器,并执行所有这一切都在一个循环,以避免与调用函数RegQueryValueEx之间的串变化问题。 – Anders