Получить имя процесса из имени приложения и наоборот, используя Applescript - PullRequest
3 голосов
/ 03 августа 2011

27 февраля 2003 года сотрудник Apple Кристофер Небел сказал, что хотел бы решить эту проблему , как сообщил Билл Чизмен:

Из-за разных имен приложений и приложений процессы в некоторых обстоятельствах, нам в конечном итоге приходится писать немного такие непонятные сценарии (если мы переименовали Adobe Photoshop 7.0 в «Фотошоп» в Finder):

tell application "Photoshop" to activate
tell application "System Events"
tell application process "Adobe Photoshop 7.0"

Достаточно сказать, что это все еще проблема в августе 2011 года, и я продолжаю сталкиваться с ней, так что я надеюсь, что хорошие люди здесь, в StackOverflow, помогут найти обходной путь; заранее спасибо!

Учитывая имя приложения (то есть что-то, что я могу указать activate), я хотел бы иметь возможность передать это имя подпрограмме, чтобы найти соответствующее имя процесса. И наоборот, учитывая имя процесса, я хотел бы иметь возможность передать его в подпрограмму для поиска соответствующего имени приложения.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011
on get_application_name(this_process)
    tell application "System Events" to set the BID to (get the id of application process this_process)
    tell application "Finder" to return the name of every item of (path to applications folder) whose id is BID and kind is "Application"
end get_application_name

-----------------------------------------------------------------------------------------------------------------------------------------

on get_process_name(this_application)
    tell application "Finder" to set the BID to (get the id of application this_application)
    tell application "System Events"
        set open_applications to (get id of every application process) as list
        return every item of open_applications whose id is BID
    end tell
end get_process_name         

Обе эти подпрограммы не проверены, поэтому они могут не делать то, что должны.: S

ОБНОВЛЕНИЕ: A process относится к приложению, которое уже открыто.

1 голос
/ 30 ноября 2013
I find this works very well:

on GetApplicationCorrespondingToProcess(process_name)
  tell application "System Events"
    set application_file to file of (application processes where name is process_name)
  end tell
  return application_file
end GetApplicationCorrespondingToProcess

on GetProcessCorrespondingToApplication(application_name)
  tell application "System Events"
    set process_name to name of my application application_name
  end tell
  return process_name
end GetProcessCorrespondingToApplication

-- Example usage:
set myprocess to GetProcessCorrespondingToApplication("Terminal") as string
set myfile to GetApplicationCorrespondingToProcess(myprocess) as string
set mypath to the POSIX path of myfile -- create this just to compare to myfile
set myapp to do shell script "myval='" & myfile & "' ; echo ${myval%.app:} | awk -F':' '{print ($NF)}'"
log myprocess
log myfile
log mypath
log myapp

-- A process appears to be the name of the MacOS executable within the application.
-- Replace "Terminal" by "Firefox" to see the distinction.
-- Also, you could substitute mypath for myfile and / for : in "set myapp ...".
1 голос
/ 04 августа 2011

Следующий код достаточно.В некоторой степени он опирается на ответ fireshadow52 и на сообщение на MacScripter.net .

on GetApplicationCorrespondingToProcess(process_name)
    tell application "System Events"
        set process_bid to get the bundle identifier of process process_name
        set application_name to file of (application processes where bundle identifier is process_bid)
    end tell
    return application_name
end GetApplicationCorrespondingToProcess

on GetProcessCorrespondingToApplication(application_name)
    tell application "System Events"
        set application_id to (get the id of application "Adobe Acrobat Professional" as string)
        set process_name to name of (application processes where bundle identifier is application_id)
    end tell
    return process_name
end GetProcessCorrespondingToApplication

-- Example usage:
display dialog (GetProcessCorrespondingToApplication("Adobe Acrobat Professional") as string)
display dialog (GetApplicationCorrespondingToProcess("Acrobat") as string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...