Mac AppleScript 用于批量关闭死终端窗口

问题描述 投票:0回答:1

在任何给定的脚本编写/测试会话(通过 Mac BBEdit)期间,我可能会让 BBEdit 执行我的测试脚本数十次,然后才能完成生产准备。完成测试后,我留下一堆“僵尸”终端窗口需要关闭。

下面显示的这个“清理”任务是一个 AppleScript 小部件,可从 BBEdit 的可自定义“脚本”菜单栏图标调用。它曾经适用于较旧的 Monterey 和 Ventura Mac(不幸的是,我不再需要与之比较)。现在我在索诺玛,它不再起作用了。不确定操作系统版本是否是问题所在,但这是最近发生的主要变化。

tell application "Terminal"
set DEAD_WINDOWS to (every window whose processes = {})
repeat with WINDOW_TO_CLOSE in DEAD_WINDOWS
close WINDOW_TO_CLOSE
end repeat
end tell

错误信息:

终端出现错误:AppleEvent 处理程序失败。数字-10000

我从 BBEdit 或直接运行 Apple 的 Script Editor.app 时收到相同的错误。

macos terminal automation applescript workflow
1个回答
0
投票

我不运行索诺玛,所以也许这不是您遇到的问题。让我知道。

无论如何,可能至少存在一个您无法获取其进程的杂散窗口。因此,当您的脚本询问每个窗口的进程时,它会失败并出现 -10000 错误。

我打开了四个可见的终端窗口,但是当我运行此命令时,它表明有五个窗口。

tell application "Terminal" to windows
--> {window id 35966 of application "Terminal", window id 28835 of application ¬
    "Terminal", window id 33742 of application "Terminal", window id 36166 ¬
    of application "Terminal"}

由于一次获取所有进程失败,我尝试循环浏览窗口,就像这样。

tell application "Terminal"
    set wl to windows
    repeat with w in wl
        processes of w
    end repeat
end tell

查看日志告诉我问题特定于最后一个窗口。即使我专注于窗口 id 36166,我也无法获取它的进程。然后我抓住了每个窗口的名称,发现它是一个异常的

"New Command"

    get every window
        --> {window id 35966, window id 28835, window id 33742, window id 36166}
    get processes of window id 35966
        --> {"login", "-zsh"}
    get processes of window id 28835
        --> {"login", "-zsh"}
    get processes of window id 33742
        --> {"login", "-zsh", "man", "sh", "sh", "sh", "less"}
    get processes of window id 36166
        --> error number -10000

    tell application "Terminal" to get processes of window id 36166
    --> error "Terminal got an error: AppleEvent handler failed." number -10000

    name of windows
        --> {"Terminal — zsh — 116×51", "Terminal — zsh — 133×30", ¬
    "Terminal — zsh — 120×24", "New Command"}

因此,我过滤掉了所有此类窗口,然后循环遍历其余窗口并关闭它们。

tell application "Terminal"
    set wList to windows whose name is not "New Command"
    
    repeat with w in wList
        if processes of w is {} then close w
    end repeat
end tell

FWIW,如果您要像这样做一样使用循环,那么将过滤命令放在循环之外并没有真正的优势。这种情况是一个例外,因为您需要过滤掉那些阻塞脚本的窗口。

© www.soinside.com 2019 - 2024. All rights reserved.