Search code examples
applescript

Get process name from application name and vice versa, using Applescript


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?


Solution

  • 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)