applescripttell

Telling applications to open and then to quit isn't working properly on applescript


This script is to open microsoft apps and then quit after 3 seconds

tell application "Finder"
set myFolder to ((startup disk as text) & "Applications:Microsoft Office 2011") as alias
set myFiles to (every item of myFolder) as alias list
open myFiles
end tell

delay 3

tell application "System Events" to set the visible of every process to true

set white_list to {"Finder"}

try
    tell application "Finder"
        set process_list to the name of every process whose visible is true
    end tell
    repeat with i from 1 to (number of items in process_list)
        set this_process to item i of the process_list
        if this_process is not in white_list then
            tell application this_process
                quit
            end tell
        end if
    end repeat
on error
    tell the current application to display dialog "An error has occurred!" & return & "This script will now quit" buttons {"Quit"} default button 1 with icon 0
end try
end tell

but when I run the script, it stops after this. (EDIT) it seems to close every app besides the microsoft applications

tell application "Finder"
set myFolder to ((startup disk as text) & "Applications:Microsoft Office 2011") as alias
set myFiles to (every item of myFolder) as alias list
open myFiles

Both opening and closing the applications scripts work great separately but I don't seem to know how to join them. If anyone knows why this is happening, that would be great. Thanks


Solution

  • The problem you're having is that telling Finder to open an app is asyncrynous in the script. Meaning, it won't finish until the app is loaded before moving on. You're never gonna get it right with the delay command, either. I'd suggest using 'tell app xxx to activate' which does wait before proceeding. And, it makes your script way cleaner.

    property myApps : {"Microsoft Word", "Microsoft Excel"}
    
    repeat with thisApp in myApps
        try
            tell application thisApp to activate
        end try
    end repeat
    
    -- do whatever you need after all are open
    
    repeat with thisApp in myApps
        try
            tell application thisApp to quit
        end try
    end repeat
    

    If you are wanting to quit every visible app except Finder, you can also add

    tell application "Finder" to set myApps to name of (every process whose ((visible is true) and (name is not "Finder")))