electron-vite 使用 regedit 注册表库获取千牛安装路径

运行环境

将regedit的 vbs 文件夹拷贝到程序根目录下的resources目录里,这个目录名不能修改。

发行环境

原版json配置

css 复制代码
"extraResources": [
      {
        "from": "node_modules/regedit/vbs",
        "to": "vbs",
        "filter": [
          "**/*"
        ]
      }
    ]

按照原版的json配置转yml配置就是这样的

electron-builder.yml 中配置
vbnet 复制代码
extraResources:
  - from: node_modules/regedit/vbs
    to: vbs
    filter:
      - "**/*"

使用

javascript 复制代码
import { readFileSync, existsSync } from 'fs'
import { spawn } from 'child_process'
import regedit from 'regedit'

const { promisified } = regedit
regedit.setExternalVBSLocation('./resources/vbs');

// 监听测试事件
ipcMain.on('test', async () => {
  console.log('主进程测试')
  try {
    const qianniuPath = await getQianniuPath() 
    console.log('启动千牛工作台路径:', qianniuPath)
    const child = spawn(qianniuPath, {
      shell: true
    })

    child.on('error', (err) => {
      console.error('启动千牛工作台失败:', err)
    })

    child.on('spawn', () => {
      console.log('千牛工作台已启动')
    })
  } catch (error) {
    console.error('获取千牛路径失败:', error)
  }
})

// 新增注册表路径常量
const QIANNIU_REG_PATHS = [
  'HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
  'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' // 确保包含标准Uninstall路径
]

// 修改获取千牛路径的方法
async function getQianniuPath(): Promise<string> {
  try {
    // 注册表路径配置说明:
    // QIANNIU_REG_PATHS - 基础注册表搜索路径(包含32/64位系统路径)
    // EXTRA_PATHS - 扩展搜索路径配置说明:
    //   1. Wow6432Node下的AliWorkbench(兼容旧版安装路径)
    //   2. 精确匹配路径(根据实际注册表结构添加)
    const EXTRA_PATHS = [
      'HKLM\SOFTWARE\Wow6432Node\AliWorkbench',
      'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\千牛工作台'
    ]

    // 异步读取注册表项列表(使用promisified接口)
    // 组合路径策略:基础路径 + 扩展路径 = 完整的搜索范围
    const keys = await promisified.list([...QIANNIU_REG_PATHS, ...EXTRA_PATHS])

    // ================== 精确路径优先匹配策略 ==================
    // 目标路径:专业版千牛的标准注册表项
    const precisePath = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\千牛工作台'
    
    // 检查精确路径是否存在(keys对象包含所有找到的注册表项)
    if (keys[precisePath]) {
      // 异步读取精确路径下的注册表值(注意:list方法需要接收数组参数)
      const result = await promisified.list([precisePath])
      
      // 解构赋值获取values对象(包含该注册表项的所有值)
      const values = result[precisePath]?.values
      
      // 路径处理逻辑:
      // 1. 检查InstallLocation是否存在
      // 2. 处理值类型(注册表值可能是REG_SZ或REG_EXPAND_SZ)
      // 3. 移除路径中的双引号(应对带空格的路径)
      if (values?.InstallLocation?.value) {
        // 类型安全处理:
        // - 字符串类型:直接替换双引号
        // - 其他类型:转换为字符串处理(如REG_EXPAND_SZ展开后的系统路径)
        const installPath = typeof values.InstallLocation.value === 'string' 
          ? values.InstallLocation.value.replace(/"/g, '') 
          : String(values.InstallLocation.value)
        
        // 构建完整可执行文件路径
        const exePath = path.join(installPath, 'AliWorkbench.exe')
        
        // 验证路径有效性(避免注册表数据与文件系统不一致)
        if (existsSync(exePath)) {
          console.log('通过精确路径找到千牛:', exePath)  // <- 用户标记的代码行
          return exePath
        }
      }
    }

  } catch (error) {
    // 错误处理策略:
    // 1. 记录原始错误信息
    // 2. 抛出业务层可识别的错误类型
    console.error('注册表读取失败:', error)
  }
  
  // 统一错误抛出(所有路径查找失败后的最终处理)
  throw new Error('未找到千牛工作台路径')
}

文档

github.com/kessler/nod...

参考

blog.csdn.net/apol/articl...

github.com/kessler/nod...

相关推荐
NEXT0628 分钟前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
剪刀石头布啊35 分钟前
生成随机数,Math.random的使用
前端
剪刀石头布啊35 分钟前
css外边距重叠问题
前端
剪刀石头布啊36 分钟前
chrome单页签内存分配上限问题,怎么解决
前端
剪刀石头布啊38 分钟前
css实现一个宽高固定百分比的布局的一个方式
前端
剪刀石头布啊41 分钟前
js数组之快速组、慢数组、密集数组、稀松数组
前端
mango_mangojuice1 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
Days20501 小时前
简单处理接口返回400条数据本地数据分页加载
前端
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
Novlan12 小时前
@tdesign/uniapp 图标瘦身
前端