Определите, установлено ли программное обеспечение и какая версия на Mac в JavaScript-файле Node.js - PullRequest
0 голосов
/ 25 октября 2018

Я нахожусь в среде узлов на Mac в приложении Electron, и мне нужно:

  1. проверить, установлен ли Photoshop
  2. получить версию установленного Photoshop
  3. Запустите Photoshop

Это было чрезвычайно просто сделать в Windows.Я использую метод платформы nodejs os modules, так что если мне нужно «Дарвин», я должен выполнить вышеуказанные действия.

Я не пользователь Mac, поэтому я не очень разбираюсь в процессах на Mac.

Я могу анализировать .plist файлы, если это необходимо, но просмотр пользовательских папок с настройками lib мало что показал.Существуют .psp файлы настроек, относящиеся к Photoshop, но у меня нет возможности посмотреть, что внутри них, и просто проверить, есть ли файл Photoshop, расположенный в папке, мне не совсем удобно, плюс мне нужно получить версию.

Решение

После некоторых исследований я наткнулся на утилиту профилирования системы mac , которая, похоже, существует во всех mac операционных системах.

с помощью модуля node exec Я получаю все установленные приложения и некоторые сведения о каждом из них, которые выглядят как

TextEdit:

 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

теперь мне просто нужно написать простой синтаксический анализатор, чтобы проанализировать результаты, которые были большими с более чем 335 приложениями, в json для удобства запросов.

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 - мой маленький метод анализа

now parsed - это объект json, к которому я обращаюсь, чтобы определить, установлен ли Photoshop и является ли несколько версий последней версией.

вот метод анализа, который нуждается в улучшении

sysProfileTxtToJson ( data: string )
{
    return new Promise<any>( ( res ) =>
    {
        let stream = new Readable();
        stream.push( data );
        stream.push( null );

        let lineReader = createInterface( stream );
        let apps = { Applications: [] };
        let lastEntry = '';
        let appPrefix = '    ';
        let appPropertyPrefix = '      ';
        let lastToggle, props = false;
        lineReader.on( 'line', ( line: string ) =>
        {
            if ( line == '' && !lastToggle )
            {
                props = false;
                return;
            }

            if ( line.startsWith( appPrefix ) && !props )
            {
                lastEntry = line.trim().replace( ':', '' );
                lastToggle = true;
                let current = {};
                current[ "ApplicationName" ] = lastEntry
                apps.Applications.push( current );
                props = true;
                return;
            }

            if ( line.startsWith( appPropertyPrefix ) && props )
            {
                lastToggle = false;
                let tokens = line.trim().split( ':' );
                let last = apps.Applications[ apps.Applications.length - 1 ];
                last[ tokens[ 0 ] ] = tokens[ 1 ].trim();
            }
        } );

        lineReader.on( 'close', () =>
        {
            res( apps );
        } );
    } );
}

1 Ответ

0 голосов
/ 25 октября 2018

В AppleScript есть несколько функций, которые можно использовать для достижения ваших требований.Рассмотрим выделение необходимых команд AppleScript / osascript через nodejs.


Давайте сначала посмотрим на соответствующие команды AppleScript ...

Фрагменты AppleScript:

  1. Следующий фрагмент AppleScript возвращает имя любой установленной версии Photoshop (например, Photoshop CS5, Photoshop CS6, Photoshop CC и т. Д.)..).Нам понадобится имя, чтобы иметь возможность успешно запустить приложение.

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

    Примечание. Фрагмент над ошибками, если установлен Photoshop , а не , поэтому мы также можем использовать его для определенияесли приложение установлено или нет.

  2. Следующий фрагмент получает любую установленную версию Photoshop:

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

    Возвращает длинную строку, указывающую версия .Это будет что-то вроде этого вымышленного примера:

    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"

Пример приложения узла:

Следующая таблица демонстрирует, как вышеупомянутые команды могут использоваться в узле.

Примечание. Ниже приведена схемаиспользует команду shelljs exec для выполнения команд 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');
  }
}
...