You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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默认路径清理逻辑之前触发,因此能获取用户输入的原始文本。
  • 目录输入框的控件ID1019是NSIS默认目录页的标准ID,无需额外修改。

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:05:17