0

BACKGROUND

An Automator script to save a screen-capture to a file was developed (by someone more clever than myself). For some reason it does not reliably (rarely) saves the screenshot to the file. Code is presented below.

The screen capture cursor consistently performs when called: the screenshot is captured to memory. In contrast, the screenshot is not consistently saved to the file as coded below

QUESTIONS

  • How can the root cause of the save issue be diagnosed?
  • Are there any obvious bugs in the code that cause the save issue?
  • Is there a permissions issue? How to confirm / test?

CODE

on run {input, parameters}

    --  # Screen Shot to Clipboard and File

    --  # Clear the clipboard so the 'repeat until isReady ...' loop works properly.

    set the clipboard to ""

    --  # Copy picture of selected area to the clipboard, press: ⌃⇧⌘4
    --  # Note that on my system I need to keystroke '$' instead of '4'.
    --  # I assume this is because the 'shift' key is being pressed.        

    tell application "System Events"
        keystroke "$" using {control down, shift down, command down}
    end tell

    --  # Wait while user makes the selection and releases the mouse or times out.
    --  # Note that the time out also acts as an escape key press of sorts. In other
    --  # words, if the user actually presses the escape key it has no effect on this
    --  # script like it would if pressing the normal shortcut outside of the script.
    --  #       
    --  # As coded, the time out is 5 seconds. Adjust 'or i is greater than 10' and or  
    --  # 'delay 0.5' as appropriate for your needs to set a different length time out.
    --  # This means, as is, you have 5 seconds to select the area of the screen you
    --  # want to capture and let go of the mouse button, otherwise it times out.

    set i to 0
    set isReady to false
    repeat until isReady or i is greater than 10
        delay 0.5
        set i to i + 1
        set cbInfo to (clipboard info) as string
        if cbInfo contains "class PNGf" then
            set isReady to true
        end if
    end repeat
    if not isReady then
        --  # User either pressed the Esc key or timed out waiting.
        return --  # Exit the script without further processing.
    end if

    --  # Build out the screen shot path filename so its convention is of 
    --  # the default behavior when saving a screen shot to the Desktop.

    set theDateTimeNow to (do shell script "date \"+%Y-%m-%d at %l.%M.%S %p\"")
    set theFilename to "Screen Shot " & theDateTimeNow & ".png"
    --  # set thePathFilename to POSIX path of (path to desktop folder as string) & theFilename
    set thePathFilename to "/Users/user/Documents/Captures/" & theFilename

    --  # Retrieve the PNG data from the clipboard and write it to a disk file.

    set pngData to the clipboard as «class PNGf»
    delay 0.5
    try
        set fileNumber to open for access thePathFilename with write permission
        write pngData to fileNumber
        close access fileNumber
    on error eStr number eNum
        try
            close access fileNumber
        end try
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
    end try

    --  # Hide the file extension as is the default.
    --  # Convert the POSIX path filename to an alias.

    set thePathFilename to POSIX file thePathFilename
    set thePathFilename to thePathFilename as alias
    tell application "Finder"
        try
            set extension hidden of thePathFilename to true
        end try
    end tell


    return input
end run
  • 1
    I'm confused why you would need this. There is a Finder shortcut for taking a screenshot of a selection and putting it on the clipbard; but there is also a shortcut for taking a screenshot of a selection and saving it straight to a file in your default screenshots folder. Why the script ? – CJK Jun 27 '18 at 20:06
  • There is certainly more than one way to 'skin a cat', however, that being said, the question stands. Documenting additional screen capture options to the original post (link in first sentence) containing the script would improve the body of knowledge. – gatorback Jun 28 '18 at 18:44
  • To diagnose the problems in the script, first remove any lines in Script Editor that say try or end try. Where there's an on error block, remove everything between on error and end try (you can comment out all these lines rather than delete them). Then run the script again (in Script Editor) and see what errors are reported back (the results pane is at the bottom of the editing window: choose Replies rather than Result). – CJK Jun 29 '18 at 8:06
1

For the benefit of other readers, it's worth noting that Finder has builtin keyboard shortcuts that will allow you to:

  • 3: take a screenshot of a selection and save it to clipboard;
  • 4: take a screenshot of a selection and save it to a file.

You can modify these shortcuts in System Preferences > Keyboard > Shortcuts > Screen Shots.

I've put a suggestion in the comments about how to begin diagnosing the original script. But, as I would have written the script slightly differently if I wanted (for some reason) to avoid using the builtin Finder keyboard shortcuts, I went ahead and wrote it:

    set screenshots to do shell script "defaults read com.apple.screencapture location"
    set timestamp to do shell script "date +'%Y-%m-%d at %H.%M.%S'"
    set type to "jpg" -- or "png"
    set filename to ["Screen Shot ", timestamp, ".", type] as text

    do shell script "SCREENCAPTURE -ioac -t " & type
    set [imgdata] to (the clipboard) as list

    tell application "Finder"
        set screenshot to (make new file ¬
            at POSIX file screenshots as alias ¬
            with properties {name:filename}) as alias

        write the imgdata as class of imgdata to the screenshot

        reveal the screenshot
    end tell

System info: AppleScript version: "2.7", system version: "10.13.4"

For one, the script is shorter, and shorter scripts provide fewer places where things can go wrong. Currently, this script works fine on my system. Therefore, you can try it on yours see if it works; if not, Script Editor will report where the errors are occurring and what they are, e.g. whether it is a file permissions error, etc.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .