AppleScript:关闭所有打开的Windows


6

我正在尝试编写一个苹果脚本来关闭所有打开的Windows。以下是我尝试的内容:

tell application "System Events"
  repeat with theProcess in (application processes where visible is true)
      tell application theProcess
          close
      end tell
   end repeat
end tell

这似乎不起作用。我明白了:

脚本错误:系统事件出错:无法获取应用程序(每个应用程序进程的第1项,其visible = true)。号码-1728

如果应用程序退出或者窗口关闭,我不在乎。

我试着调试这个,但我无法在Xcode中打开这个脚本。


编辑:感谢user3439894我已经确定了以下脚本,它只是发送Command + Q到每个可见的应用程序:

tell application "System Events"
    set theVisibleApps to (name of application processes where visible is true)
end tell



repeat with thisApp in theVisibleApps
    try
        tell application thisApp to activate
        tell application "System Events"
            keystroke "q" using command down
        end tell
    on error errMsg
        display dialog errMsg
    end try
end repeat

这对我来说现在很有用。正如user3439894建议的那样,我需要了解AppleScript语言指南

Answers:


4

第一个问题是什么(application processes where visible is true)回报。

例如,在仅使用Finder脚本编辑器打开的干净安装的macOS 10.13上:

tell application "System Events" to get application processes where visible is true

返回:

{application process "Script Editor" of application "System Events", application process "Finder" of application "System Events"}

您真正想要的是获取可见的应用程序名称列表,例如:

tell application "System Events" to get name of every application process where visible is true

返回:

{"Script Editor", "Finder"}

以下示例 AppleScript 代码将尝试关闭每个应用程序的所有打开文档,并在出错时关闭所有窗口。

现在我在TextEditPreview中打开了一些文档,然后Finder中的一些窗口运行了示例 AppleScript 代码。它关闭了TextEditPreview中的所有打开文档以及Finder中的所有窗口,但不关闭脚本编辑器

注意:这不会关闭和脚本编辑器文档和静默错误:

error "The document can’t be closed while the script is running."

示例 AppleScript 代码

tell application "System Events"
    set theVisibleApps to (name of application processes where visible is true)
end tell

repeat with thisApp in theVisibleApps
    try
        tell application thisApp
            try
                close every document without saving
            on error
                close every window
            end try
        end tell
    end try
end repeat

另外请注意,这个例子 的AppleScript 作为编码不会关闭每个文件关闭每一个窗口的的应用程序不支持这些命令,应该默默地失败因为的try 命令

示例 AppleScript 代码用于说明您当前代码的错误以及如何帮助实现目标的示例


谢谢@ user3439894。如果我显示错误,我发现{ApplicationName} got an error: every document does not understand the "close" message.无论如何做某事click button 1 of window 1或者按Ctrl + W或Ctrl + Q发送每个窗口?
OO

@OO,正如我在回答中所说,“这个示例 AppleScript 代码用于说明您当前代码的错误以及如何帮助实现目标的示例。” 并且代码就是这样的示例代码,并不打算成为您要完成的任何内容的完整解决方案。该例子 的AppleScript 代码肯定可以被修改,以适应附加条件/场景中,你只需要编写代码的时候满足您的需求适当。
3439894

你能不能给我一些文件或任何可以帮助我的东西。我也不明白为什么我们需要应用程序名称而不是应用程序进程?无论如何迭代窗口?即对于每个应用程序,对于每个窗口,关闭或发送密钥代码。
OO

@OO,Re:“你能不能给我一些文档...”在“脚本编辑器”中,单击“帮助”菜单,然后选择“显示AppleScript语言指南”。Re:“我也不明白为什么我们需要应用程序名称而不是应用程序进程?” 因为您的代码错误并且不是编码它的正确方法。在你的代码tell application theProcess变成例如tell application item 1 of every application process whose visible = true,它将转换为例如tell application application process "Script Editor" of application "System Events",并且是不正确的编码形式。
3439894

@OO,您使用应用程序名称列表,以循环列表并在每个应用程序上执行一些操作。并非每个应用程序都直接AppleScript脚本化或响应相同的命令,为什么在某些情况下,您必须以不同方式执行给定的过程,或者也使用UI脚本。如果你想要一个强力方法,那么在repeat with thisApp in theVisibleApps 循环中,使用do shell script "killall " & quoted form of thisApp那将强制关闭每个打开的可见应用程序,基于其余的代码。
3439894
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.