背景
某些情况下(譬如使用py或C++),软件安装路径包括中文的话,会导致报错;
因此需要限制只能安装在全英文目录,找了好多资料都没找到Electron-builder中有这种配置,因此只能另辟蹊径,在yml中指定nsh来增加安装流程来检测用户的安装路径。
如果有大神有更优雅的实现方法赶紧告诉我=。=
实现
没有学过nsh的语法,都是找各种资料来实现出来的,有需要的话可以参考下;
nsh
# 宏 修改安装目录后,安装前
!macro customPageAfterChangeDir
Page custom customPageCreator customPageLeave
Var Dialog
; 以 Unicode 字符串的方式进行判断是否含有中文
Function PathIsDBCS_W
Exch $R0
Push $R1
Push $R2
Push $R3
System::Call "*(&w${NSIS_MAX_STRLEN}R0)p.R1"
StrCpy $R0 0
StrCpy $R2 $R1
lbl_loop:
; Unicode 版取 2 个字节长度的字符,字符串遇到 0 字符表示结束了。
System::Call "*$R2(&i2.R3)"
IntCmp $R3 0 lbl_done
; Unicode 字符直接判断字符值,大于 128 的我们就视为非英文字符。
IntCmp $R3 128 0 lbl_skip
IntOp $R0 $R0 !
Goto lbl_done
lbl_skip:
; 如果用 NSIS 3.x 这里可以用 IntPtrOp 代替。
IntOp $R2 $R2 + 2
Goto lbl_loop
lbl_done:
System::Free $R1
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
Function customPageCreator
${IfNot} ${isUpdated}
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
; 检查安装路径是否包含双字节字符 (不限于简体中文)。
Push $INSTDIR
Call PathIsDBCS_W
Pop $R0
${If} $R0 == '1'
StrCpy $4 "路径请勿包含中文,请点击 上一步 重新设置安装路径"
${EndIf}
${If} $R0 == '0'
StrCpy $4 ""
${EndIf}
${NSD_CreateGroupBox} 10% 10u 80% 100u "请确定安装目录"
Pop $0
${NSD_CreateLabel} 15% 26u 15% 10u "安装目录:"
Pop $0
${NSD_CreateLabel} 30% 26u 50% 50u $INSTDIR
Pop $0
${NSD_CreateLabel} 15% 80u 80% 10u $4
Pop $0
nsDialogs::Show
${EndIf}
FunctionEnd
Function customPageLeave
; 如果 $INSTDIR 含有中文等宽字节字符,则不让用户安装在这里
${If} $R0 == '1'
MessageBox MB_ICONEXCLAMATION|MB_OK "路径请勿包含中文,请点击"上一步"重新设置安装路径"
Abort
${EndIf}
FunctionEnd
!macroend
效果如图所示