只需要添加下面一段代码即可,每句代码的意思已经备注在后面,应该挺清楚的。
Function .onVerifyInstDir
StrCpy $0 $INSTDIR ;$0存放安装路径
StrLen $1 $0 ;获取$0的长度,存在$1里
StrCpy $2 ''
; 每个中文会给strlen增加2,所以copy 1个字符时,会遇到不可显示字符,会被NSIS自动改成?
; 正好?本身是非法路径,所以可以用这个来判断路径是否非法
${Do}
IntOp $1 $1 - 1 ;开始循环,$1 = $1 - 1
${IfThen} $1 < 0 ${|}${ExitDo}${|} ;遍历结束,退出
StrCpy $2 $0 1 $1 ;从第$1位开始,最多从$0中取1位,存在$2中
${IfThen} $2 == '?' ${|}${ExitDo}${|} ;$2 为 '?' 退出循环
${Loop}
${If} $2 == '?'
Abort ; 如果 $INSTDIR 含有中文等宽字节字符,则不让用户安装在这里
${EndIf}
FunctionEnd