Get process name from application name and vice ve

2020-07-22 19:45发布

问题:

On 27 February 2003, Apple employee Christopher Nebel said he'd like to straighten out this problem as reported by Bill Cheeseman:

Because of the different naming for applications and application processes in some circumstances, we end up having to write slightly confusing scripts like this (if we've renamed Adobe Photoshop 7.0 to "Photoshop" in the Finder):

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

Suffice it to say, it's still a problem in August 2011, and I keep running into it, so I hope the good folks here at StackOverflow can help find a workaround; thanks in advance!

Given an application name (i.e. something I can instruct to activate), I'd like to be able to pass that name to a subroutine to find the corresponding process name. Conversely, given a process name, I'd like to be able to pass it to a subroutine to find the corresponding application name.

Any suggestions?

回答1:

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         

Both of these subroutines are untested, so they may not do what they're supposed to. :S

UPDATE: A process refers to an application that is already open.



回答2:

The following code suffices. It draws, to some extent, upon fireshadow52's answer and upon a post at 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)


回答3:

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 ...".


标签: applescript