在 macOS Catalina 下的 Finder 中查找活动壁纸文件的脚本

Posted

技术标签:

【中文标题】在 macOS Catalina 下的 Finder 中查找活动壁纸文件的脚本【英文标题】:Script to find active wallpaper file in Finder under macOS Catalina 【发布时间】:2020-02-19 19:52:59 【问题描述】:

我曾经使用两个 AppleScript 脚本从 macOS Mojave 下的桌面 1 和桌面 2(双显示器模式)中找出实际壁纸图像的文件名。一个脚本用于主监视器,另一个脚本用于第二个监视器。在 macOS Catalina 下,脚本不再工作。

这是脚本:

tell application "System Events"
    set posix_path to (pictures folder of desktop 2)
    set picPath to (POSIX file posix_path) as string
end tell
set thePictures to (do shell script "sqlite3 ~/Library/Application\\ Support/Dock/desktoppicture.db \"SELECT data.value FROM preferences INNER JOIN data on preferences.key=16 and preferences.picture_id=7 and preferences.data_id=data.ROWID\"")
set fullPath to picPath as string
set rotationImage to fullPath & thePictures
tell application "Finder"
    try
        set aliasItem to item rotationImage
        if class of aliasItem is alias file then
            reveal original item of aliasItem
        end if
    end try
end tell

这是错误信息:

tell application "System Events"
    get pictures folder of desktop 1
        --> "/Users/peter/Library/Caches/com.apple.preference.desktopscreeneffect.desktop/69948584/DSKPhotosRootSource"
    get POSIX file "/Users/peter/Library/Caches/com.apple.preference.desktopscreeneffect.desktop/69948584/DSKPhotosRootSource"
        --> error number -1728 from POSIX file "/Users/peter/Library/Caches/com.apple.preference.desktopscreeneffect.desktop/69948584/DSKPhotosRootSource"
end tell
tell current application
    do shell script "sqlite3 ~/Library/Application\\ Support/Dock/desktoppicture.db \"SELECT data.value FROM preferences INNER JOIN data on preferences.key=16 and preferences.picture_id=1 and preferences.data_id=data.ROWID\""
        --> "13725B"
end tell
tell application "Finder"
    get item "Macintosh HD:Users:peter:Library:Caches:com.apple.preference.desktopscreeneffect.desktop:69948584:DSKPhotosRootSource13725B"
        --> error number -1728 from item "Macintosh HD:Users:peter:Library:Caches:com.apple.preference.desktopscreeneffect.desktop:69948584:DSKPhotosRootSource13725B"
end tell

试图找到问题,但找不到解决方案。我不是一位经验丰富的 AppleScript 作家。希望有人能帮忙。

【问题讨论】:

【参考方案1】:

在 Catalina 和 Mojave 上,我可以使用类似于您的 sqlite 命令获取当前壁纸:

sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "select * from data" | tail -2

或者在 Applescript 中:

do shell script "sqlite3 ~/Library/Application\\ Support/Dock/desktoppicture.db 'select * from data' | tail -2"

在我的 Mac 上,数据表中的最后 2 项似乎是最近设置的壁纸和最近设置的最后 2 个显示的组合,所以我 tail 列表.像你一样,我也在使用一个大的壁纸文件夹,我将它设置为每 30 分钟更换一次。只要我不手动更换壁纸,最后 2 项始终是 2 个活动壁纸的名称,因为两台显示器每 30 分钟同时更换一次。

注意事项:当您使用选中“更改图片:”复选框的文件夹时,从select * data 返回的项目只是文件名(即壁纸.jpg)。如果您已将壁纸设置为单个图像,则从 select 命令返回的项目是图像的完整路径(即 /path/to/folder/wallpaper.jpg)。由于我使用的是文件夹,所以我只在select 结果中获得图像名称。然后我可以用换行符拆分这两个名称,以获取数组中的每个壁纸名称,然后 open 它们。这是我的整个脚本:

#!/bin/bash

#reads and opens the last 2 items from the 'data' table in the desktoppicture.db sqlite db

last_two=`sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "select * from data" | tail -2`
 
IFS=$'\n' read -rd '' -a y <<<"$last_two"

#echo "first is $y[0]"
#echo "second is $y[1]"

open /Users/myusername/Pictures/Desktop\ Pictures/$y[0]
open /Users/myusername/Pictures/Desktop\ Pictures/$y[1]

我知道您问了一个 AppleScript 问题,这主要是一个 bash 脚本答案,但我的答案顶部的 do shell script 项应该让您能够捕获和操作 AppleScript 中的图像名称。

为了解决这个问题,我在 Alfred 中使用这个 bash 脚本,使用关键字“retire”来停用我厌倦的壁纸。我输入关键字,此脚本运行以在预览中打开图像,另一个脚本运行以打开我的 Desktop Pictures 文件夹和 Desktop Pictures Retired 文件夹,然后我手动将照片移动到 Retired 文件夹中。

【讨论】:

脚本的第一部分运行良好,并带回了当前壁纸图像的文件名“5007B”。只有脚本的第二部分显示错误号 -1728。这部分脚本在finder 中显示原始图像。我可以在查找器中手动导航到路径 HD:Users:peter:Library:Caches:com.apple.preference.desktopscreeneffect.desktop:69948584:DSKPhotosRootSource-TopLevelAlbums5007B" 并右键单击图像 5007B 并单击"显示原始"以获取查找器中显示的原始文件,但这很不方便。[1]:i.stack.imgur.com/WaEp7.png【参考方案2】:

如果您当前连接了两台显示器,并且您只是想检索每个显示器的桌面墙纸的名称,那么下面的 Apple 脚本代码应该就是您要查找的内容。

tell application "System Events"
    set everyDesktop to desktops
    set desktopOnePicture to picture of item 1 of everyDesktop
    set desktopTwoPicture to picture of item 2 of everyDesktop
end tell

【讨论】:

您好,感谢您的回答。我测试了您的脚本并发现该脚本显示了我启动或重新启动 iMac 时显示的屏幕壁纸。它不显示实际桌面的壁纸图像。 macOS 根据桌面和屏幕保护程序设置更改这些图像。在我的设置中,两台显示器上的桌面壁纸图像每 5 分钟更换一次,并且是从“照片”中的所有图像中随机选择的。 我在 macOS Mojave 下运行的旧脚本可以找到显示器实际壁纸的文件名,并打开一个查找器窗口,准确显示该图像文件。 macOS Mojave 和 Catalina 之间的变化破坏了我的脚本,我根本没有足够的经验来找出它是什么。【参考方案3】:

我不能保证下面的代码会比已经发布的解决方案更好,但理论上它应该针对每个屏幕(显示器)而不是桌面(空间)的桌面图像。但是,我没有 Mojave 或 Catalina,也没有计算机来测试:

use framework "AppKit"

property NSScreen : a reference to NSScreen in the current application
property NSWorkspace : a reference to NSWorkspace in the current application

property currentScreen : a reference to the mainScreen of NSScreen

on screen(i as integer)
        local i

        if i = 0 then return the currentScreen()
        return NSScreen's screens()'s item i
end screen

on desktopImageURLForScreen:(i as integer)
        local i

        set S to screen(i)
        tell NSWorkspace's sharedWorkspace() to return the ¬
                desktopImageURLForScreen_(S) as «class furl»
end desktopImageURLForScreen:

return the POSIX path of my desktopImageURLForScreen:0

底线是您最可能想要尝试的,通过更改传递给处理程序的索引号。如果您有三个监视器,那么它们每个都由索引123 之一标识(我无法预测索引如何对应于监视器的排列)。索引0 将始终引用当前具有键盘焦点的屏幕。

【讨论】:

嗨 CJK,感谢您的脚本。运行后,脚本编辑器中的结果为“/Users/peter/Library/Caches/com.apple.preference.desktopscreeneffect.desktop/69948584/DSKPhotosRootSource/”。我测试了不同的指标(0、1、2、3),结果在补丁中显示了不同的数字。它没有给我图像的文件名。如果没有在 Catalina 下进行测试的可能性,我想你很难。无论如何,谢谢。

以上是关于在 macOS Catalina 下的 Finder 中查找活动壁纸文件的脚本的主要内容,如果未能解决你的问题,请参考以下文章

解决MacVim在macOS Catalina下字母显示不全的问题

virtualbox安macOS Catalina

MacOS 10.15 Catalina 的颤振问题

升级macos catalina卡顿怎么办

如何在 MacOS (sierra-catalina) 上为分区获取可用空间

MacBook Pro(13 英寸,2011 年末)A1278 官方最高支持macOS High Sierra,使用macOS Catalina Patcher成功安装macOS Catalina