today we’re going to look at revising the script from the last post to make it more user friendly and robust. here was what we finished with last time :
you may need to review how that script functions before proceeding : renaming finder items IV
refining a script for optimal usability is largely a matter of asking a bunch of “what if …?” questions. what if the user does this? what if the user does that? what if the user is a thicky? etc.
we’re going to do some simple refinements :
- what if the user enters nothing in the first dialog? — we’ll give them the option to append something to the start of the filename.
- what if the user enters nothing in the second dialog? — we’ll give them the option to simply delete the ‘change from’ text from the filename.
- what if the user doesn’t fully understand what the script is going to do? — we’ll give them a confirmation message before proceeding.
- how will we know how successful the script was? — we’ll include some extra reporting at the end of the process.
first we’ll add three variables right after the first line of the script :
set mgAppend to "NUP" set mgChanged to {} set mgUnChanged to {}
the first is a simple switch we’ll use for an if/then statement when it comes time to actually change the filenames. the other two are empty lists that will get populated as the script processes the files. these will be the basis for the end reporting.
the next part goes straight after presenting the change from dialog. it creates another window to check what to do if the user enters nothing in the change from dialog. this is where the mgAppend variable gets switched if required :
set mgChangeFrom to text returned of mgChangeFromDialog if mgChangeFrom is "" then set mgJustChecking to display dialog "So, do you want to append the new text to the front of the filename?" buttons {"No — Cancel", "Yes — Append"} default button 2 if button returned of mgJustChecking is "No — Cancel" then error number -128 else set mgAppend to "YEP" end if end if
does that all make sense so far?
now after collecting the change from and change to data from the user and running the considering case check, we’ll have three possible scenarios (apart from the script having been cancelled) :
- we have nothing for change from and a text string for change to (append)
- we have a text string for both change from and change to (replace)
- we have a text string for change from but nothing for change to (delete)
we can use those possible scenarios to build one of three possible confirmation dialogs like this :
if mgChangeTO is not "" then if mgAppend is "YEP" then set mgConfirmationText to "JUST CONFIRMING." & return & return & "Filenames will be changed so that :" & return & " '" & mgChangeTO & "'." & return & "is appended to the front of each filename." & return & return & "IS THAT CORRECT?" else set mgConfirmationText to "JUST CONFIRMING." & return & return & "Filenames will be changed so that :" & return & " '" & mgChangeFrom & "'" & return & "becomes" & return & " '" & mgChangeTO & "'." & return & return & "IS THAT CORRECT?" end if else set mgConfirmationText to "JUST CONFIRMING." & return & return & "Filenames will be changed so that :" & return & " '" & mgChangeFrom & "'" & return & "is deleted." & return & return & "IS THAT CORRECT?" & return & return & return & "{WARNING : this change cannot be undone}" end if set mgConfirmation to display alert mgConfirmationText buttons {"HELL NO! STOP", "YES! Go do that thing"} default button "HELL NO! STOP" as critical if button returned of mgConfirmation is "HELL NO! STOP" then error number -128 end if
the portion of the script that does the actual name changing is a bit more complicated now. it needs to allow for appending (as required) and for populating those two lists we need for reporting purposes :
tell application "Finder" repeat with mgitem in mgSelection set mgOriginalName to name of mgitem if mgAppend is "YEP" then set mgNewName to (mgChangeTO & mgOriginalName) as string set name of mgitem to mgNewName set end of mgChanged to mgOriginalName else set text item delimiters of AppleScript to mgChangeFrom set mgNameItems to text items of mgOriginalName set text item delimiters of AppleScript to "" set mgItemCount to count mgNameItems if mgItemCount is not 1 then set text item delimiters of AppleScript to mgChangeTO set mgNewName to mgNameItems as string set text item delimiters of AppleScript to "." set mgNameCheck to text item 1 of mgNewName set text item delimiters of AppleScript to "" if mgNameCheck is "" then display dialog "Sorry, You cannot have a file with no name at all" buttons "dammit" default button 1 error number -128 end if set name of mgitem to mgNewName set end of mgChanged to mgOriginalName else set end of mgUnChanged to mgOriginalName end if end if end repeat end tell
and, finally, we have the reporting process. the original script simply popped up a window saying “All Done”. this version will give the user some helpful feedback :
set mgCountSelection to count mgSelection set mgCountChanged to count mgChanged set mgCountUnChanged to count mgUnChanged if mgUnChanged is not {} then if mgCountUnChanged is less than 12 then set mgUnChangedList to "They are: " & return & " " repeat with mgUnChangedItem in items of mgUnChanged set mgUnChangedList to mgUnChangedList & mgUnChangedItem & return & " " end repeat else set mgUnChangedList to "Here are some of them: " & return & " " repeat with x from 1 to 10 set mgUnChangedItem to item x of mgUnChanged set mgUnChangedList to mgUnChangedList & mgUnChangedItem & return & " " end repeat end if end if if mgCountSelection = mgCountChanged then set mgMessage to "All " & mgCountSelection & " files were successfully renamed." else if mgCountSelection = mgCountUnChanged then set mgMessage to "Sorry, none of the " & mgCountSelection & " files were successfully renamed." & return & return & "You probably stuffed something up." else set mgMessage to (mgCountChanged & " filenames were successfully renamed." & return & return & (count mgUnChanged) & " filenames were NOT changed because " & return & "they do not contain '" & mgChangeFrom & "'." & return & return & mgUnChangedList) as string end if display dialog mgMessage
the dialog will list the names of the unchanged files. if there are too many it will just list the first 10 :
the finished script would look something like this.
there’s a bunch of different ways to improve this script. the next post will look at changing it so that it can be activated in a number of ways (rather than only by dropping files) and how to make the finished app run MUCH faster.
til then, keep grunting.
• related post : renaming finder items : renaming using automator or applescript.
• related post : renaming finder items II : renaming by list.
• related post : renaming finder items III : renaming by creation date.