NSIS路径正斜杠被删除问题:如何实现斜杠归一化处理
NSIS路径正斜杠自动丢失问题的解决方法
NSIS默认目录页会自动移除输入路径中的正斜杠,导致C:\Foo/Bar被错误处理为C:\FooBar,且.onVerifyInstDir回调是在NSIS清理路径后触发,无法捕获原始输入。以下是两种可行的解决思路:
方案1:自动将正斜杠转换为反斜杠
通过自定义目录页回调,直接读取输入框的原始文本,在NSIS清理前完成斜杠归一化:
!include "LogicLib.nsh" !include "WinMessages.nsh" Outfile "testscript-output.exe" Name "NSIS test script" ShowInstDetails show InstallDir "$PROGRAMFILES\NSIS_Test" ; 自定义目录页,绑定回调函数 PageEx directory PageCallbacks onDirPagePreShow onDirPageVerify PageExEnd Page instfiles Function onDirPagePreShow ; 获取目录输入框句柄(默认目录页输入框控件ID为1019) FindWindow $R0 "#32770" "" $HWNDPARENT GetDlgItem $R1 $R0 1019 ; 初始化输入框内容为默认安装路径 SendMessage $R1 ${WM_SETTEXT} 0 "STR:$INSTDIR" FunctionEnd Function onDirPageVerify ; 读取输入框的原始文本(未被NSIS处理) FindWindow $R0 "#32770" "" $HWNDPARENT GetDlgItem $R1 $R0 1019 SendMessage $R1 ${WM_GETTEXT} 1024 "STR:$R2" ; 遍历原始文本,将正斜杠替换为反斜杠 StrLen $R3 $R2 StrCpy $R4 "" ; 存储处理后的路径 StrCpy $R5 0 ; 当前遍历索引 loop_replace: StrCmp $R5 $R3 done_replace StrCpy $R6 $R2 1 $R5 ; 判断当前字符是否为正斜杠,是则替换 StrCmp $R6 "/" replace_slash keep_char replace_slash: StrCat $R4 "\" Goto next_char keep_char: StrCat $R4 $R6 next_char: IntOp $R5 $R5 + 1 Goto loop_replace done_replace: ; 将处理后的路径赋值给$INSTDIR StrCpy $INSTDIR $R4 ; 验证路径有效性(可选) IfFileExists "$INSTDIR\" +0 invalid_path Return invalid_path: MessageBox MB_OK|MB_ICONERROR "无效的安装路径,请检查输入。" Abort FunctionEnd Section MessageBox MB_OK "最终安装路径:$INSTDIR" SectionEnd
方案2:禁止输入正斜杠并提示用户
如果不希望自动转换,而是直接禁止正斜杠输入,可修改验证回调逻辑:
!include "LogicLib.nsh" !include "WinMessages.nsh" Outfile "testscript-output.exe" Name "NSIS test script" ShowInstDetails show InstallDir "$PROGRAMFILES\NSIS_Test" PageEx directory PageCallbacks onDirPagePreShow onDirPageVerify PageExEnd Page instfiles Function onDirPagePreShow FindWindow $R0 "#32770" "" $HWNDPARENT GetDlgItem $R1 $R0 1019 SendMessage $R1 ${WM_SETTEXT} 0 "STR:$INSTDIR" FunctionEnd Function onDirPageVerify ; 获取原始输入文本 FindWindow $R0 "#32770" "" $HWNDPARENT GetDlgItem $R1 $R0 1019 SendMessage $R1 ${WM_GETTEXT} 1024 "STR:$R2" ; 检查是否包含正斜杠 StrStr $R3 $R2 "/" StrCmp $R3 "" valid_path invalid_char invalid_char: MessageBox MB_OK|MB_ICONERROR "安装路径不能包含正斜杠(/),请使用反斜杠(\)。" Abort valid_path: StrCpy $INSTDIR $R2 IfFileExists "$INSTDIR\" +0 invalid_path Return invalid_path: MessageBox MB_OK|MB_ICONERROR "无效的安装路径,请检查输入。" Abort FunctionEnd Section MessageBox MB_OK "最终安装路径:$INSTDIR" SectionEnd
关键说明
- 自定义目录页的回调
onDirPageVerify会在NSIS默认路径清理逻辑之前触发,因此能获取用户输入的原始文本。 - 目录输入框的控件ID
1019是NSIS默认目录页的标准ID,无需额外修改。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

