确定Node.js JavaScript中是否已安装软件以及Mac上的版本

时间:2018-10-24 21:40:41

标签: javascript node.js macos plist photoshop

我在Electron应用程序中的Mac上的节点环境中,我需要:

  1. 测试是否已安装Photoshop
  2. 获取已安装的Photoshop版本
  3. 启动Photoshop

这一切在Windows中都非常容易做到。我在nodejs操作系统模块平台方法上分支,因此如果使用“达尔文”,则需要执行上述操作。

我不是Mac用户,所以我对Mac上的进程了解不多。

如果需要,我可以解析.plist文件,但是在用户lib首选项文件夹中显示的内容很少。有特定于Photoshop的.psp首选项文件,但我无法查看其中的内容,而仅检查文件夹中是否有Photoshop文件似乎对我来说很草率,而且我需要获取版本。 / p>

解决方案

经过研究,我发现了 mac 系统分析器实用程序,该实用程序似乎存在于所有 mac 操作系统上。

使用node的{​​{1}}模块,我获得了所有已安装的应用程序以及有关每个应用程序的一些详细信息

  

TextEdit:

exec

现在,我只需要编写一个简单的解析器即可将335个以上应用程序的结果解析为json以便于查询。

 Version: 1.13
 Obtained from: Apple
 Last Modified: 6/29/18, 11:19 AM
 Kind: Intel
 64-Bit (Intel): Yes
 Signed by: Software Signing, Apple Code Signing Certification Authority, Apple Root CA
 Location: /Applications/TextEdit.app

import { exec } from 'child_process'; let proc = exec( 'system_profiler SPApplicationsDataType -detailLevel mini' ); let results = ''; proc.stdout.on( 'data', ( data ) => { results += `${ data }`; } ); proc.on( 'close', async ( code ) => { let parsed = await this.sysProfileTxtToJson( results ); } ); 是我的小解析方法

现在sysProfileTxtToJson是一个json对象,我查询该对象以确定是否安装了photoshop,以及是否有多个版本是最新版本。

这是需要改进的解析方法

parsed

1 个答案:

答案 0 :(得分:2)

AppleScript中有一些功能可以用来满足您的要求。考虑通过nodejs 掏空必要的AppleScript / osascript命令。


首先让我们看一下相关的AppleScript命令...

AppleScript片段:

  1. 以下AppleScript代码段返回安装的Photoshop版本的名称(例如Photoshop CS5Photoshop CS6Photoshop CC等)。我们需要名称才能成功启动该应用程序。

    tell application "Finder" to get displayed name of application file id "com.adobe.Photoshop"
    

    注意:如果未安装 ,则上面的代码段会出错,因此我们也可以利用它来确定是否已安装该应用程序。

  2. 以下代码段获取安装的Photoshop版本:

    tell application "Finder" to get version of application file id "com.adobe.Photoshop"
    

    这将返回一个长字符串,指示the version。这将是一个虚构的示例:

      

    19.0.1 (19.0.1x20180407 [20180407.r.1265 2018/04/12:00:00:00) © 1990-2018 Adobe Systems Incorporated


启动Photoshop:

在推断出已安装PhotoShop之后,请考虑利用Bash的open命令启动该应用程序。例如:

open -a "Adobe Photoshop CC"

示例节点应用程序:

以下要点演示了如何在节点中使用上述命令。

注意:下面的要点是利用shelljsexec命令来执行AppleScript / osascript命令。但是,您可以改为使用内置child_process.execSync()child_process.exec()的节点。

const os = require('os');
const { exec } = require('shelljs');

const APP_REF = 'com.adobe.Photoshop';
const isMacOs = os.platform() === 'darwin';

/**
 * Helper function to shell out various commands.
 * @returns {String} The result of the cmd minus the newline character.
 */
function shellOut(cmd) {
  return exec(cmd, { silent: true }).stdout.replace(/\n$/, '');
}


if (isMacOs) {

  const appName = shellOut(`osascript -e 'tell application "Finder" \
      to get displayed name of application file id "${APP_REF}"'`);

  if (appName) {
    const version = shellOut(`osascript -e 'tell application "Finder" \
        to get version of application file id "${APP_REF}"'`).split(' ')[0];

    console.log(version); // Log the version to console.

    shellOut(`open -a "${appName}"`); // Launch the application.
  } else {
    console.log('Photoshop is not installed');
  }
}