目标:识别macOS中最新的浏览器窗口,并获取其活动标签的URL和标题作为Markdown链接。
它注定是由其他应用程序触发的Alfred工作流,但是现在我仅在脚本编辑器中调试它的核心。我同时打开了Safari和Chrome浏览器,以及许多其他应用程序。通过调试,我可以看到它正确列出了所有打开的窗口,但是它与任何一个if
条件都不匹配。作为进一步的证据,如果我仅单独使用tell application
行,则会返回正确的结果。我敢肯定这很简单。
set output to ""
tell application "System Events"
set appNames to name of every application process whose visible is true
repeat with appName in appNames
if (appName = "Google Chrome") then
using terms from application "Google Chrome"
tell application appName to set currentTabTitle to title of active tab of front window
tell application appName to set currentTabUrl to URL of active tab of front window
end using terms from
set output to "[" & currentTabTitle & "](" & currentTabUrl & ")"
exit repeat
else if (appName = "Safari") then
using terms from application "Safari"
tell application appName to set currentTabTitle to name of front document
tell application appName to set currentTabUrl to URL of front document
end using terms from
set output to "[" & currentTabTitle & "](" & currentTabUrl & ")"
exit repeat
end if
end repeat
end tell
return output
答案 0 :(得分:1)
正如评论中所讨论的那样,您的脚本所做的假设是AppleScript将返回应用程序订购的最近关注的进程列表,但事实并非如此。
但是,您可以使用Shell命令lsappinfo metainfo
以此顺序检索应用程序名称列表。通过一些其他命令来对此进行分类,以隔离感兴趣的信息并清理文本:
lsappinfo metainfo \
| grep bringForwardOrder \
| grep -E -o '"[^"]+"' \
| tr -d "\""
产生一个漂亮的,可读的,有序的应用程序列表,其中最后一个项的最新活动比其下一个项的活动最近:
Google Chrome
Script Editor
Atom
Messages
WhatsApp
Finder
Safari
Script Debugger
WebTorrent
对此进行测试,当我切换到脚本编辑器,然后再次运行shell命令时,返回的列表是:
Script Editor
Google Chrome
Atom
Messages
WhatsApp
Finder
Safari
Script Debugger
WebTorrent
由于您只想了解两个特定应用程序( Safari 和 Google Chrome )之间的顺序,因此可以将shell命令简化为:
lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1
将返回一个名称,即当前处于活动状态或最近具有焦点的浏览器;或一个空字符串(例如,如果两个浏览器均未运行)。
将此内容整合到您的AppleScript中,并进行一些清理:
property nil : ""
set [currentTabTitle, currentTabUrl] to [nil, nil]
set cmd to "lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1"
set frontmostBrowser to do shell script cmd
if the frontmostBrowser = "" then return nil
if the frontmostBrowser = "Google Chrome" then
tell application "Google Chrome" to tell ¬
(a reference to the front window) to tell ¬
(a reference to its active tab)
if not (it exists) then return nil
set currentTabTitle to its title
set currentTabUrl to its URL
end tell
else if the frontmostBrowser = "Safari" then
tell application "Safari" to tell ¬
(a reference to the front document)
if not (it exists) then return nil
set currentTabTitle to its name
set currentTabUrl to its URL
end tell
end if
return "[" & currentTabTitle & "](" & currentTabUrl & ")"
但是,我建议实际上将该脚本编写为Shell脚本。我相信Shell脚本会比AppleScript快,因为与编译和运行AppleScript相比,AppleScript花费更多的时间来生成Shell进程并运行Shell脚本(在这种情况下,尽管通常,{ {1}}通常比本地AppleScript进程慢。另一个好处是,通过使用shell变量替换,我们可以使生成的脚本更加紧凑,将两个浏览器AppleScript代码块压缩为一个单一的,双重用途的文本脚本,osascript
可以编译一次已经进行了变量替换(从而避免了我在评论中提到的运行时/编译时恶意)。
shell(bash)脚本如下所示:
osascript