Electron安装路径禁止中文

背景

某些情况下(譬如使用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

效果如图所示

相关推荐
掘金挖土38 分钟前
前端手摸手跑路之 AI 应用开发(九)
前端·后端
中文呀3 小时前
三维 GIS 离线缓存实战:逆向 CesiumOfflineCache,并亲手为它补上"自动更新"能力
前端
前进前进前进4 小时前
TRAE 全链路实战:做了一个警示牌一键生成器:纯 Canvas、单文件、零依赖
前端
小万7425 小时前
God‘s Eye View 深度解析:15 路公开信号 + CesiumJS 的浏览器级 OSINT 控制台,60 帧渲染的“真实间谍卫星模拟器”
前端
IT星宿5 小时前
浏览器标签页全是一个图标:我用名字哈希生成 favicon,让每个项目都有身份标识
前端
全栈项目管理程序猿5 小时前
ArcGIS JS 基础教程(32):体元系列 - VoxelSlice 体元切片
前端·javascript
拖孩7 小时前
AI 帮我写的小程序「厨菜记」上线满月了,挣了两百块!!!
前端·后端·微信小程序
用户360055579007 小时前
Kestrel_VLLM - 13 · 为什么排除 MoE FFN Tiling 与 Tensor Core
前端
Hilaku7 小时前
AI 流式输出都用 SSE,什么时候必须换 WebSocket?
前端·javascript·程序员