如何使用AppleScript关闭所有隐藏的应用程序?

如何使用AppleScript关闭所有隐藏的应用程序?,applescript,exit,Applescript,Exit,我有一个用于关闭所有应用程序的应用程序脚本: 它很好用。它将退出所有打开的应用程序 我的问题是,我想修改此脚本以仅关闭隐藏的应用程序。出于某种原因,苹果隐藏了所有没有活动窗口的苹果制造的应用程序,最终它开始吞噬我的内存 我的想法是,如果我只是将可见为true的行更改为可见为false的行,我就会得到这个结果 不完全是: 我甚至不知道这个窗口应该是什么,所以我点击了“取消” 嗯,它又出现了。事实证明,在脚本爆炸之前,我必须准确地点击取消四次 是否有任何方法可以退出所有隐藏的应用程序,同时让可见的

我有一个用于关闭所有应用程序的应用程序脚本:

它很好用。它将退出所有打开的应用程序

我的问题是,我想修改此脚本以仅关闭隐藏的应用程序。出于某种原因,苹果隐藏了所有没有活动窗口的苹果制造的应用程序,最终它开始吞噬我的内存

我的想法是,如果我只是将可见为true的行
更改为可见为false的行
,我就会得到这个结果

不完全是:

我甚至不知道这个窗口应该是什么,所以我点击了“取消”

嗯,它又出现了。事实证明,在脚本爆炸之前,我必须准确地点击取消四次

是否有任何方法可以退出所有隐藏的应用程序,同时让可见的应用程序保持打开状态

(如果您能解释上述弹出窗口,则可获得额外积分。)


如果有区别的话,我正在运行最新版本的OSX。

visible
设置为false会影响所有进程,甚至是没有GUI的进程/应用程序。如果进程不是应用程序(.app),则会显示应用程序选择器

添加一个只影响带有GUI的应用程序的
后台检查

tell application "System Events" to set quitapps to name of every application process whose visible is true and background only is false and name is not "Finder" ...

如果我理解正确的话,您所说的是当您按下红色的关闭按钮时,它只关闭应用程序的窗口,而不是应用程序本身,因此它仍然保持打开状态。

在这种情况下,你可以使用我制作的这个脚本,它似乎完美无瑕:

-- Get open apps
tell application "System Events" to set openApps to name of every application process whose background only is false and name is not "Finder"

-- Do this for every open app
repeat with openApp in openApps
    tell application openApp
        -- Tell application to quit if it doesn't have any open windows
        if (count of windows) is less than or equal to 0 then quit
    end tell
end repeat
OSX不会“隐藏”应用程序。它们只是不活动,或者没有打开任何文档。隐藏应用程序是一个非常特殊的过程,通常使用Command-H完成。应用程序不会以这种方式隐藏自己

与其尝试关闭没有窗口的应用程序,不如使用文档计数来确定是否关闭应用程序

tell application "SomeApp" if count of documents = 0 then quit

这是一个奇怪的问题。由于我不知道的原因,你必须把东西分开才能让它工作。这将退出所有不在igApp列表中的非后台应用程序。我添加了“不保存”来处理文本编辑之类的文档应用,但显然,这是可选的。虽然这可能会简化一些,但它似乎工作可靠

tell application "System Events"
    set igApp to {"Finder", "Script Editor", "firefox"}
    
    set qList to {}
    set fApp to name of every application process whose background only is false
    
    repeat with xx in fApp
        if xx is not in igApp then
            copy contents of xx to end of qList
        end if
    end repeat
end tell

repeat with yy in qList
 quit application yy without saving
end repeat
-- qlist
请注意,如果您想退出部分(或全部)后台应用程序,您可能需要重新考虑。这些都是在后台做事情,除非出了什么差错,否则它们通常不会滥用计算机资源。有些可能需要强制退出才能停止。如果您的计算机空闲时缺少RAM,则可能是某些应用程序损坏/有问题,或者您需要更多RAM


话虽如此,如果您将“后台进程”切换为true,它应该可以在任何后台应用程序上工作。正如我所说,我建议您不要这样做,但是您可以注释掉“退出应用程序”行,然后取消注释“qlist”(最后一行),然后您将得到这些应用程序的列表。你可以在Activity Monitor的内存面板中查找这些应用程序,看看这些应用程序的需求有多低。在我的mac电脑上,如果你排除像“Dock”这样明显的应用程序,它们使用的内存小于200 MB。

这与我想要的正好相反。它会退出所有打开而未隐藏的应用程序。我尝试将该行修改为
,其可见值为false,背景值为false,但没有任何效果。将其修改为
,其可见值为false,背景值为true
刚刚重新启动了我的dock。所有这些操作都使隐藏的应用程序保持打开状态。
可见
在系统事件中表示
不隐藏
仅后台
表示没有GUI或“不是应用程序”的匿名应用程序。只有应用程序(
.app
)响应
退出
命令好的,但这仍然不能满足我的要求。我不知道你的情况,但当我运行它时,它根本不起作用。如果应用程序处于隐藏状态,它仍会将窗口识别为打开状态。如果所有窗口都已关闭,但应用程序仍处于打开状态,则应用程序仍不会关闭。请查看
openApps
以及打开但未打开窗口的应用程序的
窗口计数,告诉我结果。
tell application "System Events"
    set igApp to {"Finder", "Script Editor", "firefox"}
    
    set qList to {}
    set fApp to name of every application process whose background only is false
    
    repeat with xx in fApp
        if xx is not in igApp then
            copy contents of xx to end of qList
        end if
    end repeat
end tell

repeat with yy in qList
 quit application yy without saving
end repeat
-- qlist