How to check in AppleScript if an app is running, without launching it - via osascript utility

后端 未结 6 700
眼角桃花
眼角桃花 2020-11-30 20:11

Consider the following AppleScript:

on is_running(appName)
    tell application \"System Events\" to (name of processes) contains appName
end is_running

set         


        
6条回答
  •  旧巷少年郎
    2020-11-30 20:47

    All the previously made answers suffer from the same issue, though:

    They look for the app by its name. However, the user may rename the app, and then the script will believe the app does not run, when in fact it does.

    To properly check for a running app, it should be found by its bundle ID, which the user cannot change.

    The bundle ID can be inquired with this command, for instance, when the app is already running:

    tell application "System Events"
        get bundle identifier of application process "Safari"
    end tell
    

    Or like this for any installed app:

    get id of application "Safari"
    

    To check whether an app with a particular bundle ID is running, use this code:

    tell application "System Events"
        set ids to bundle identifier of every application process
        if ids contains "com.apple.safari" then
            return "Running"
        else
            return "Not running"
        end if
    end tell
    

    Furthermore, here's an example to check if an app is running, then quit it, then relaunch it, ensuring that the very same app is relaunched that was running before, and not some other copy that may also exist:

    set bundleID to "com.apple.safari"
    set apps to runningApps(bundleID)
    set appCount to length of apps
    if appCount is not 0 then
        quit application id bundleID
        repeat while length of runningApps(bundleID) = appCount
            -- wait for the app to quit
        end repeat
        open first item of apps
    end if
    
    on runningApps(bundleID)
        -- The try block is to catch the rare case of having more than one
        -- copy of an app running at the same time. Unfortunately, in that
        -- case this code will not run as expected, because we don't get the
        -- correct list of multiple items back then. But at least the script
        -- will not crash from it but handle it gracefully.
        tell application "System Events"
            try
                return application file of (every application process whose bundle identifier = bundleID)
            end try
        end tell
        return {}
    end runningApps
    

提交回复
热议问题