我曾经使用两个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作家。希望有人能帮忙。
答案 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
通过更改传递给处理程序的索引号,您最可能要尝试的是底线。如果您有三个监视器,则它们将分别由索引1
,2
或3
中的一个标识(我无法预测索引如何对应于监视器的排列)。索引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”“退休”文件夹,然后手动将照片移至“退休”文件夹。