user2555399
user2555399

Reputation: 209

Applescript get list of running apps?

Applescript newbie question again :) I am trying to create a small applescript that will allow me to select multiple items from a list of currently running applications and then quit those selected apps. Something like this works but rather than having to click on each dialog it would be much easier to chose from a list.

tell application "System Events"
repeat with p in every process
    if background only of p is false then
        display dialog "Would you like to quit " & name of p & "?" as string
    end if
end repeat
end tell

Any and all help would be greatly appreciated!

Thanks!

Upvotes: 16

Views: 16774

Answers (8)

user3439894
user3439894

Reputation: 7575

The following example AppleScript code is pretty straight forward and will gracefully quit the selected application(s), providing the selected application(s) is (are) in a stable state:

tell application "System Events" to ¬
    set appList to the name of ¬
        every process whose visible is true

set quitAppList to ¬
    choose from list appList ¬
        with multiple selections allowed

repeat with thisApp in quitAppList
    quit application thisApp
end repeat

When I present a list to choose from, I prefer to have it in alphabetical order and to that end I use a handler to first sort the list before presenting it:

on SortList(thisList)
    set indexList to {}
    set sortedList to {}
    set theCount to (count thisList)
    repeat theCount times
        set lowItem to ""
        repeat with i from 1 to theCount
            if i is not in the indexList then
                set thisItem to item i of thisList as text
                if lowItem is "" then
                    set lowItem to thisItem
                    set lowItemIndex to i
                else if thisItem comes before lowItem then
                    set lowItem to thisItem
                    set lowItemIndex to i
                end if
            end if
        end repeat
        set end of sortedList to lowItem
        set end of indexList to lowItemIndex
    end repeat
    return the sortedList
end SortList

To use this with the first block of code presented I typically add handlers at the bottom of my code and then to use it, add the following example AppleScript code between the tell application "Finder" to ¬ and set quitAppList to ¬ statements:

set appList to SortList(appList)

Note: I acquired this particular handler somewhere on the Internet too many years ago to remember and unfortunately lost who to credit it to. My apologies to whomever you are.

Upvotes: 1

wch1zpink
wch1zpink

Reputation: 3142

I wrote this following AppleScript code a few years back. I consider it to be a “Must Have” because I use it almost every single day.

This code will generate a list of Visible and Hidden application processes, allowing multiple items to be selected to kill their processes. The first items in the list will be visible application processes (not sorted alphabetically), then an empty list item (used to separate the visible from the hidden processes), and the remaining list items will be the hidden application processes (sorted alphabetically)

use framework "Foundation"
use scripting additions

property appsToKill : missing value
property NSArray : a reference to current application's NSArray

listAllAppProcesses()

activate
set killApp to (choose from list ¬
    appsToKill with title "Choose The App To Kill" with prompt ¬
    "Choose The App/Apps To Kill" & linefeed & linefeed ¬
    & "The Empty List Item Separates The Visible From The Hidden Applications" OK button name ¬
    "OK" cancel button name "CANCEL" with multiple selections allowed)

set pidList to {}

if killApp is not false then
    tell application "System Events"
        repeat with i from 1 to count of killApp
            set thisItem to item i of killApp
            tell application process thisItem
                set thePID to unix id
                set end of pidList to thePID
            end tell
        end repeat
    end tell
else
    return
end if

set text item delimiters to space
do shell script ({"kill -9", pidList} as text)

on listAllAppProcesses()
    tell application "System Events"
        set visibleAppsToKill to name of every application process ¬
            where visible is true
        set invisibleAppsToKill to name of every application process ¬
            where visible is false
        set aList to ((NSArray's arrayWithArray:invisibleAppsToKill)'s ¬
            sortedArrayUsingSelector:"caseInsensitiveCompare:") as list
        set appsToKill to visibleAppsToKill & "" & aList
    end tell
end listAllAppProcesses

enter image description here

Upvotes: 1

juanfal
juanfal

Reputation: 123

If you want it from Terminal, you can use a simple script like this quit.rb

Upvotes: 0

Mahmoud Adam
Mahmoud Adam

Reputation: 5852

you can use this script which is much simpler

tell application "Finder"
    get the name of every process whose visible is true
end tell

Upvotes: 7

James
James

Reputation: 121

& (name of every process whose (name is "AppName") can be added to Michele Percich's and Parag Bafna's solutions to include specific menu bar applications by name.

tell application processName to quit can be used instead of do shell script "Killall " & quoted form of processName.

tell application "System Events"
    set processList to ¬
        (name of every process where background only is false) & ¬
        (name of every process whose ¬
            (name is "AppName") or ¬
            (name is "AnotherAppName"))
    tell me to set selectedProcesses to choose from list processList with prompt "Select process(es) to quit:" with multiple selections allowed
end tell
if the result is not false then
    repeat with processName in selectedProcesses
         tell application processName to quit
    end repeat
end if

Upvotes: 1

Michele Percich
Michele Percich

Reputation: 1902

Try this:

tell application "System Events"
    set listOfProcesses to (name of every process where background only is false)
    tell me to set selectedProcesses to choose from list listOfProcesses with multiple selections allowed
end tell
--The variable `selectedProcesses` will contain the list of selected items.
repeat with processName in selectedProcesses
    do shell script "Killall " & quoted form of processName
end repeat

Upvotes: 21

Parag Bafna
Parag Bafna

Reputation: 22930

tell application "System Events"
    set processList to get the name of every process whose background only is false
    set processNameList to choose from list processList with prompt "Select process to quit" with multiple selections allowed
    if the result is not false then
        repeat with processName in processNameList
            do shell script "Killall " & quoted form of processName
        end repeat
    end if
end tell

enter image description here

Upvotes: 6

robin
robin

Reputation: 25

You can try this

tell application "System Events"
        set AppName to name of every process whose background only is false
        choose from list AppName OK button name "Ok" cancel button name "Cancel"
    end

Upvotes: 1

Related Questions