Applescript - 自动关闭页面文档

时间:2014-01-12 02:30:12

标签: applescript

我正在尝试创建一个自动关闭Apple Pages最前面窗口的脚本。

    on run {}
    tell application "System Events"
        if (window 1 of process "Pages" exists) then
            try
                tell application "Pages"
                    --display dialog "Hello World!" --TODO: remove, test code only.
                    --Keywords I have tried: file, document, window, 
                    close window 1 saving no
                end tell
                --close window 1 of process "Pages" saving no
            on error errMsg
                display dialog "ERROR: " & errMsg
            end try
        end if
    end tell
end run

每当我运行它时,它会给我以下错误:

  

错误:页面出错:窗口1无法理解“关闭”   消息。

我查看了this article,并使用了以下命令:

sudo defaults write /Applications/Pages.app/Contents/Info NSAppleScriptEnabled -bool YES

然而,它仍然无法工作。有什么建议吗?

详细说明:
系统版本:OS X 10.9.1(13B42)
内核版本:达尔文13.0.0
页数:5.0.1

1 个答案:

答案 0 :(得分:1)

如果Pages不是可编写脚本的,那么有点运气不好。如果它是可编写脚本的,则不需要系统事件来关闭窗口;这种功能通常包含在可编写脚本的应用程序字典中。

系统事件可以帮助处理不可编写脚本的应用程序,但您必须依赖实际的UI。但如果这是解决方案,则不能将tell application "Pages"用于内部块(就像你拥有它一样);你必须使用:

tell process "Pages"

如果你走这条路,现在你必须使用窗口1上的关闭按钮或使用关闭菜单命令。类似的东西:

activate application "Pages"--note that this will probably be NECESSARY (if it's not frontmost, it prob won't work)
tell application "System Events"
    tell process "Pages"
        click menu item "Close" of menu "File" of menu bar item "File" of menu bar 1 of it
    end tell
end tell

但是那么你必须想出如果窗口尚未保存(已被修改)会发生什么的问题 - 在可编写脚本的应用程序中使用你最初尝试的构造。使用系统事件时,您可以执行以下操作:

activate application "Pages"--note that this will probably be NECESSARY (if it's not frontmost, it prob won't work)
tell application "System Events"
    tell process "Pages"
        click menu item "Close" of menu "File" of menu bar item "File" of menu bar 1 of it
        delay .5
        keystroke "d" using command down
    end tell
end tell

但是又如何使脚本足够智能以了解窗口是否已被修改?或者也许您使用系统事件来查看窗口是否在关闭命令后被杀死,如果没有,则执行击键操作。这种事情可以通过以下方式完成:

activate application "Pages"
tell application "System Events"
    tell process "Pages"
        set frontMostWinName to name of window 1
        click menu item "Close" of menu "File" of menu bar item "File" of menu bar 1 of it
        tell me to delay 0.5
        if exists window 1 then
            if name of window 1 = frontMostWinName then keystroke "d" using command down
        end if
    end tell
end tell

我没有Pages,但这适用于另一个不可编写脚本的应用程序Bean(虽然我应该提到Bean使用制表符,但我必须将一个制表符移动到一个窗口才能使其工作*,而我不知道Pages在这方面是如何工作的)。 [编辑:*实际上,这不是真的;这适用于Bean而不管选项卡/窗口]