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

时间:2019-10-23 14:21:26

标签: macos applescript wallpaper macos-catalina

我曾经使用两个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作家。希望有人能帮忙。

3 个答案:

答案 0 :(得分:0)

如果您当前连接了两台显示器,而您只是想为每台显示器检索桌面墙纸的名称,那么下面的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

答案 1 :(得分:0)

我不能保证下面的代码比已经发布的解决方案更好,但是从理论上讲,它应该针对每个屏幕(显示器)而不是桌面(空间)定位桌面图像。但是,我没有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将始终指向当前具有键盘焦点的屏幕。

答案 2 :(得分:0)

在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个活动墙纸的名称,因为两个监视器每隔30分钟同时更改一次。

注意事项:当使用“更改图片:”复选框的文件夹时,从select * data返回的项目只是文件名(即wallpaper.jpg)。如果您已将墙纸设置为单个图像,则select命令返回的项目就是图像的完整路径(即/path/to/folder/wallpaper.jpg)。由于我使用的是文件夹,因此我在select结果中仅获得图像名称。然后,我可以用换行符将2个名称拆分为一个数组,以获取每个墙纸名称,然后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”“退休”文件夹,然后手动将照片移至“退休”文件夹。