Node.js 如何打开本地应用

最近在开发的过程中接到这样一个需求,需要通过代码,帮助用户启动本地的 Docker Desktop。

需求背景

我们做的是一个 electron 应用,在用户使用的过程中会依赖到 docker 。为了减少用户操作,我们需要在检测到 docker 没有启动的情况下,帮助用户唤起docker Desktop。

实现过程

不同的操作系统,唤起 Dcoker Desktop 的方式都不一样,Linux 用户通常不会安装 Docker Desktop ,所以,Linux 用户启动docker 的方式很简单,直接通过命令行 sudo systemctl start docker ,Mac 系统也有自己专门启动应用的指令 open -a Docker,最难搞的就是 Windows 系统......

不同的用户在安装 Docker 的时候会选择不同的安装位置,所以找到 Docker 的安装位置就很关键。

Docker 在安装的时候,会在系统的注册表中写入安装位置的相关信息,所以我们要获取到 Docker 安装地址,可以从查询系统注册表入手。

javascript 复制代码
import { execSync } from 'child_process'
import path from 'path'

function findDockerDesktop() {
  try {
    // 应用名称
    const applicationName = 'Docker'
    // 查询注册表
    const command = `reg query "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" /s /f "${applicationName}"`;

    // 执行查询命令
    const res = execSync(command);
    const stdout = res.toString()
    const match = stdout.match(/InstallLocation\s+REG_SZ\s+(.*)/)

    if (match && match[1]) {
      const dockerInstallerPath = path.resolve(match[1].trim(), 'Docker Desktop.exe')
      return dockerInstallerPath
    } else {
      throw new Error('未找到应用程序的安装位置');
    }
  } catch (error) {
    console.error(`查询应用程序安装位置时出错: ${(error as Error).message}`);
  }
}

这里通过 reg query 命令直接查询系统系统的注册表,查询的应用名称是 Docker

由于 execSync 返回的结果是一个 Buffer,所以我这里通过 toString 把他转成 utf8 字符串。查询结果如下:

列表中的 InstallLocation 对应的地址就是 Docker 的安装位置。我们通过正则将其查出来。

这一条就是我们想要的,但是这个只是 Docker 的安装目录,要启动 Docker 还要找到他的可执行文件,所以要在安装目录的地址上再拼上 Docker Desktop.exe

找到这个 Docker 的可执行文件之后,接下来就简单多了。

直接启动!

javascript 复制代码
function setupDocker() {
  try {
    execSync(findDockerDesktop())
    console.log('Windows Docker Desktop started successfully!')
  } catch (error) {
    console.error((error as Error).toString())
  }
}

执行之后发现会报错......

bash 复制代码
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
Error: Command failed: C:\Program Files\Docker\Docker\Docker Desktop.exe
'C:\Program' is not recognized as an internal or external command,      
operable program or batch file.

这个错误的原因是路径中的 C:\Program Files,在执行这条命令的时候,终端把 File 及其之后的部分当成 C:\Program 参数了,要解决这个问题也很简单,把这个命令用字符串再包一层就可以了。

javascript 复制代码
function setupDocker() {
  try {
    execSync(`"${findDockerDesktop()}"`)
    console.log('Windows Docker Desktop started successfully!')
  } catch (error) {
    console.error(error.message)
  }
}

写到这里,基本就完成了整个功能的实现。如果要兼容 Mac 系统的话,可以再把最后的代码再小改一下。

javascript 复制代码
function setupDocker() {
  try {
    if (process.platform === 'darwin') {
      execSync('open -a Docker')
      console.log('Mac Docker Desktop started successfully!')
    } else {
      execSync(`"${findDockerDesktop()}"`)
      console.log('Windows Docker Desktop started successfully!')
    }
  } catch (error) {
    console.error(error.message)
  }
}

这次真的写完了,哦对了,我是个前端er......

相关推荐
黑云压城After3 小时前
H5使用环信实现视频或语音通话
前端·javascript·vue.js
未来之窗软件服务4 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
你的人类朋友5 小时前
什么是断言?
前端·后端·安全
FIN66686 小时前
昂瑞微:实现精准突破,攻坚射频“卡脖子”难题
前端·人工智能·安全·前端框架·信息与通信
椎4956 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
@。1246 小时前
对于灰度发布(金丝雀发布)的了解
开发语言·前端
我有一棵树6 小时前
前端图片加载失败、 img 出现裂图的原因全解析
前端
FIN66686 小时前
昂瑞微冲刺科创板:硬科技与资本市场的双向奔赴
前端·人工智能·科技·前端框架·智能
im_AMBER6 小时前
杂记 14
前端·笔记·学习·web
牧杉-惊蛰6 小时前
disable-devtool 网络安全 禁止打开控制台
前端·css·vue.js