In my applescript, I am trying to select all subfolders in selected folders. The script seems to successfully select the wanted subfolders, but the each them in multiple separate windows according to their parent folder. Is there a way to force them to be open in one window (as if you expand folders in list view and cmd click to select subfolders from multiple folders)?
Thanks,
Poon
Here is the code, just in case.
tell application "Finder"
set SelectedFolders to selection
set i to 1
set NewSelection to {}
repeat with aFolder in SelectedFolders
repeat with bFolder in aFolder
copy bFolder to the end of NewSelection
end repeat
end repeat
select every item of NewSelection
end tell
You can try "set selection" instead of "select". The front Finder window will have to be in list view and the appropriate folder will have to be expanded already. Basically if what you're trying to select is not visible in the front Finder window then it will not work.
set selection to NewSelection
I do not know of a way to expand a folder programatically. However you can ensure the Finder window is in list view using this...
set current view of Finder window 1 to list view
I think what you're trying to do will prove difficult. I couldn't get it to work consistently in my brief testing. Good luck.
I wouldn't rely on this...
tell application "Finder"
set SelectedFolders to selection
if SelectedFolders = {} then return
set current view of Finder window 1 to list view
my rightArrow()
set NewSelection to {}
repeat with aFolder in SelectedFolders
set NewSelection to NewSelection & folders of aFolder
end repeat
if NewSelection ≠ {} then
set selection to NewSelection
my rightArrow()
end if
end tell
on rightArrow()
activate application "Finder"
tell application "System Events"
tell process "Finder"
key code 124
end tell
end tell
end rightArrow
Related
I have the following AppleScript that works fine when I step through each line one at a time using Script Debugger, but reports that the _doc variable has a missing value when it gets the the save as line.
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
tell application "Finder"
set _folder to choose folder
set _files to files of _folder
repeat with _file in _files
if creator type of _file is "MSWD" then
tell application "Microsoft Word"
open _file
set _doc to document of window 1
save as _doc file format format text
close _doc
end tell
end if
end repeat
end tell
I've tried pausing for as long as 5 seconds using delay 5 with no change in the behavior. Why might this be happening and what can I do about it?
The answer to "why might this be happening" seems to be "it probably is a timing problem" and "because there are a number of problems when automating Word from both AppleScript and VBA on Mac that Microsoft has not yet fixed". I don't think there's much you can do about it except report to Microsoft via the Smiley mechanism or via word.uservoice.com. On uservoice, best to add your vote than existing request if there is one. But there is no reason at all to believe that Microsoft will even acknowledge or fix quite serious automation problems at the moment.
I had not come across the problem where you couldn't even set _doc to document of window 1 successfully. I was always able to use
set _doc to open _file
Here, I found a "delay 5" was enough to solve the problem you report, but there has also long been a problem where the "_doc" variable becomes invalid after a save as. I had a solution to that that iterates through the windows, so have put together this script which
a. should reduce the delay as much as possible
b. works on simple test data here but could do with improvement, especially on error checking
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
tell application "Finder"
set _folder to choose folder
set _files to files of _folder
repeat with _file in _files
if creator type of _file is "MSWD" then
tell application "Microsoft Word"
--activate
set doc_count to (count of documents)
open _file
-- You have to set the maximum no. of repeats
-- high enough for your system
set repeats to 50
repeat until (count of documents) > doc_count or repeats = 0
set repeats to repeats - 1
end repeat
if (count of documents) > doc_count then
set _doc to (document (doc_count + 1))
set _windows to the windows
repeat with _window in _windows
if the full name of the document of _window is the full name of _doc then
set _windowIndex to the entry_index of _window
exit repeat
end if
end repeat
-- you need to create a new file name for each file.
-- this is a temporary kludge
set _textfilename to (posix full name of _doc) & ".txt"
save as _doc file name _textfilename file format format text
-- _doc now invalid, we need to "reconnect"
set _windows to the windows
repeat with _window in _windows
if the entry_index of _window is _windowIndex then
set _doc to the document of _window
exit repeat
end if
end repeat
close _doc saving no
else
-- you can make this more informative, and you might still need to
-- try to close something.
display dialog "Could not open document: " & POSIX path of _file
end if
end tell
end if
end repeat
end tell
Incidentally, when I tested on a single document using open recent file instead, there was never any problem getting a reference to the document. But that's useless for the kind of thing you're trying to do.
I'm trying to fully automate a workflow for getting images into iPhoto. The last piece of the puzzle is handling duplicate images. Currently I see no way in Applescripts import command to not import duplicates. Therefore when a duplicate arrises all workflow stops and iPhoto waits for input.
Is there a way to get through this?
You will need to script this. Here is a bit of code that seems to work inside applescript editor. Adjust accordingly for automator...
set iFolder to (choose folder)
set iFiles to (list folder iFolder)
tell application "iPhoto"
repeat with iFile in iFiles
try
set pFound to get (every photo of album "Photos" whose image filename is iFile)
end try
if length of pFound is not 0 then
log ("File '" & iFile as text) & "' exists..."
# Move or delete it here
end if
end repeat
# Continue with import
import from (iFolder as alias)
end tell
I'm not sure what i am doing wrong but after this command finishes, the script ends yet there is still another command to complete, would anyone know what I am doing wrong. Thanks
I enter this in, it runs through
tell application "Finder"
activate
display dialog "Are you sure you want to shut down your computer now?" buttons {"Restart", "Sleep", "Shutdown"} with icon alias ((path to me as text) & "Contents:Resources:power.icns")
if the button returned of the result is "Restart" then
set theSeconds to 10
repeat theSeconds times
display dialog theSeconds buttons {"Stop"} giving up after 1 with title "Restarting..." with icon 0 default button 1
set theSeconds to (theSeconds - 1)
set volume 6
beep 1
end repeat
tell application "Finder"
restart
end tell
else
if the button returned of the result is "Sleep" then
set theSeconds to 10
repeat theSeconds times
display dialog theSeconds buttons {"Stop"} giving up after 1 with title "Sleeping..." with icon 0 default button 1
set theSeconds to (theSeconds - 1)
set volume 6
beep 1
end repeat
tell application "Finder"
sleep
end tell
else
if the button returned of the result is "Shutdown" then
set theSeconds to 10
repeat theSeconds times
display dialog theSeconds buttons {"Stop"} giving up after 1 with title "Shutting Down..." with icon 0 default button 1
set theSeconds to (theSeconds - 1)
set volume 6
beep 1
end repeat
tell application "Finder"
shut down
end tell
and this is the command that comes after, but doesn't run
set appLocation to path to me as string
set theFile to appLocation & "Contents:Resources:iPanic.app"
tell application "Finder" to open file theFile
delay 8
tell application "Terminal"
activate
set currentTab to do script {"defaults write com.apple.LaunchServices LSQuarantine -bool YES"}
delay 1
do script {"Killall Finder"} in currentTab
end tell
The reason the end of your script doesn’t run is that by the time the script gets to that point, your computer has either restarted, is sleeping, or has been shutdown.
The restart, sleep, or shutdown command needs to be the very last command in your script.
You can make the final part of your script into a subroutine, and call that subroutine before the restart, sleep, or shutdown commands.
Wrap the final part of your script like this:
on finalPart()
…
end finalPart
And then you call that subroutine like this:
finalPart() of me
restart
You can name the subroutine something more descriptive to you than “finalPart” of course.
Also, where you are calling the restart, sleep, and shutdown commands, you don’t need the tell block that is around them because you are already talking to Finder at that point. You can remove the line directly above and directly below the restart, sleep, and shutdown commands.
And here:
tell application "Terminal"
activate
set currentTab to do script {"defaults write com.apple.LaunchServices LSQuarantine -bool YES"}
delay 1
do script {"Killall Finder"} in currentTab
end tell
You don’t have to run a shell script with the Terminal app. The “do shell script” command is a Standard Addition that works in every app. And to quit Finder, all you have to do is tell it to quit. So unless you have more going on in your “Killall Finder” script than just quitting the Finder, you can probably write the above like this:
tell application "Finder"
do shell script "defaults write com.apple.LaunchServices LSQuarantine -bool YES"
delay 1
quit
end tell
Of course, if that part of the script is already within a Finder tell block, you can remove the tell command from the above.
I'm trying to set it so that there's no user interaction when I open up my illustrator file using applescript, but the standard:
tell application id "com.adobe.Illustrator"
activate
set user interaction level to never interact
open theFile without dialogs
doesn't work for this plugin I have installed that checks for white overprints.
If it were up to me I'd just uninstall the plugin but it's for a work pc.
I also tried clicking the button automatically (with help from Tim Joe) by using:
try
tell application "System Events"
tell process "Finder"
click button "OK" of window "Adobe Illustrator"
end tell
end tell
end try
and I've tried
tell application "System Events"
tell process "Adobe Illustrator"
keystroke return
end tell
end tell
Does anyone know a way of solving this?
below is the full code as it currently stands:
set saveLocation to ((path to desktop) as string) --place to save the files
set theFile to choose file with prompt "Choose the Illustrator file to get outlines on"
set outputFolder to choose folder with prompt "Select the output folder"
tell application "Finder" to set fileName to name of theFile
set fullPath to (saveLocation & fileName) --file path of new .ai
set fileName to (text 1 thru ((length of fileName) - 3) of fileName) --remove .ai from fileName
set olPath to text 1 thru ((length of fullPath) - 3) of fullPath & "_OL.ai" --path of outlined file
tell application id "com.adobe.Illustrator"
activate
ignoring application responses
open theFile without dialogs
end ignoring
tell application "System Events"
tell process "Adobe Illustrator"
repeat 60 times -- wait up to 60 seconds for WOPD window to appear
try
tell window "White Overprint Detector"
keystroke return
exit repeat
end tell
on error
delay 1
end try
end repeat
end tell
end tell
save current document in file fullPath as Illustrator with options {class:Illustrator save options, compatibility:Illustrator 15, font subset threshold:0.0, embed linked files:true, save multiple artboards:false} --save file to desktop
convert to paths (every text frame of current document) --convert text to paths
save current document in file olPath as Illustrator with options {class:Illustrator save options, compatibility:Illustrator 15, font subset threshold:0.0, embed linked files:true, save multiple artboards:false} --save another copy to desktop with name + _OL.ai
end tell
tell application "Finder"
set newFolder to make new folder at saveLocation with properties {name:fileName}
move fullPath to newFolder --create new folder and move both new files into it
move olPath to newFolder
set newFolderPath to (newFolder) as string
set newFolderPath to text 1 thru -2 of newFolderPath --remove the trailing ":"
tell current application --zip up the new folder
set qpp to quoted form of POSIX path of newFolderPath
do shell script "cd $(dirname " & qpp & ")
zip -r \"$(basename " & qpp & ").zip\" \"$(basename " & qpp & ")\""
end tell
set zipFile to newFolderPath & ".zip"
move zipFile to outputFolder --move .zip to output
delete newFolder --delete folder on desktop left from zipping
end tell
--prepare a notification email
set presetText to "Hello,
Files Uploaded:
" & fileName & ".zip
To access our FTP Server:
http://217.207.130.162:8080/WebInterface/login.html
To access our FTP server, log onto our website below:
Username:
Password:
Thanks,
Joe"
tell application "Mail" --open up prepared email
activate
set theMEssage to make new outgoing message with properties {visible:true, subject:fileName, content:presetText}
end tell
--open file containing usernames and passwords for the FTP
do shell script "open /Users/produser/Desktop/FTP_Users"
I tracked down and installed White Overprint Detector I could see what you mean. I had to use an older version as I only have CS3, and I saw the dialog it produces when you open a document. The following worked for me to get it to dismiss:
tell application "Adobe Illustrator" to activate
tell application "System Events"
tell process "Adobe Illustrator"
repeat 60 times -- wait up to 60 seconds for WOPD window to appear
try
tell window "White Overprint Detector"
keystroke return
exit repeat
end tell
on error
delay 1
end try
end repeat
end tell
end tell
Since my original post seemed too objective to understand I will revise.
With in the tell block for illustrator look for your line that opens the file. Some commands allow with and without properties. Try applying the "without dialogs" property to look something like this.
tell application id "com.adobe.Illustrator"
open file (VariableOfFilePath) without dialogs
end tell
Update:
Two work arounds I can think of. 1) Try telling system events to tell AI to open without dialogs
tell application "system events"
tell application id "com.adobe.Illustrator"
open file (VariableOfFilePath) without dialogs
end tell
end tell
Other is just add in a bit that will just okay the prompt.
try
tell application "System Events"
tell process "Finder"
click button "Continue" of window "Adobe Illustrator"
end tell
end tell
end try
Can try just having it accept the default button.
tell application "System Events"
tell process "Finder"
keystroke return
end tell
end tell
I have a simple Applescript that takes a number of images in a folder that you select and then mirror images the images using Graphic Converter. This script will run if I place it in a new AS file; however, if I try to run it a second time I get the following error "Can't get window 1 of application "GraphicConverter". Invalid index."
This script always ran on OSX 10.6
I'm running OSX 10.7.4 and Graphic Converter 8.1 (latest version).
Here is the script
tell application "Finder"
activate
set loopFinish1 to 0
set pathName to (choose folder with prompt "Choose Folder Containing Images")
set fileList1 to every file of folder pathName
set loopFinish1 to count of items of fileList1
end tell
tell application "GraphicConverter"
activate
repeat with i from 1 to loopFinish1
set currentFile to item i of fileList1
open currentFile as alias
mirror window 1 in horizontal
close window 1 saving yes
end repeat
end tell
This is driving me crazy!
GraphicConverter has other windows (visible and invisible), it's preferable to use the document to get the right window.
Also, perhaps the image doesn't open, so no window, use a try block.
activate
set pathName to (choose folder with prompt "Choose Folder Containing Images")
tell application "Finder" to set fileList1 to (document files of folder pathName) as alias list
tell application "GraphicConverter"
activate
repeat with tFile in fileList1
set currentDoc to open tFile
set CurrWindow to (first window whose its document is currentDoc)
mirror CurrWindow in horizontal
close currentDoc saving yes
end repeat
end tell