Я нахожусь в среде узлов на Mac в приложении Electron, и мне нужно:
- проверить, установлен ли Photoshop
- получить версию установленного Photoshop
- Запустите 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 );
} );
} );
}