有没有办法获取当前电脑壁纸的文件名?
壁纸文件夹内有2000张图片,设置电脑壁纸在该文件夹内随机展示。经常在换到某一张壁纸的时候需要去寻找到源文件,尝试过许多方法都不行。(有一种方法是通过终端命令,但是一旦输入就会立即随机到下一张壁纸,这是没意义的,我需要的是当前显示的这一张的文件名)请问有没有高手能过做到?谢谢!
MacBook Pro
壁纸文件夹内有2000张图片,设置电脑壁纸在该文件夹内随机展示。经常在换到某一张壁纸的时候需要去寻找到源文件,尝试过许多方法都不行。(有一种方法是通过终端命令,但是一旦输入就会立即随机到下一张壁纸,这是没意义的,我需要的是当前显示的这一张的文件名)请问有没有高手能过做到?谢谢!
MacBook Pro
那你可以嘗試參考一下這個
Script to display current wallpaper in use
--display the file name
tell application "Finder"
set theDesktopPic to desktop picture
set theName to displayed name of theDesktopPic
display dialog theName
end tell
--show where the pic is in the Finder
tell application "Finder"
set theDesktopPic to desktop picture
set theName to displayed name of theDesktopPic
reveal theDesktopPic
end tell
defaults write com.apple.dock desktop-picture-show-debug-text -bool TRUE;killall Dock
tell application "Finder"
set theDesktopPic to desktop picture
get properties of theDesktopPic
end tell
你試一下這個, 看它下面的輸出是什麼.
找到了一个方法,如果设置的是从"文件夹" 读取壁纸列表 或者“Apple > 颜色”设置单一颜色,可以用下面的命令 读取文件名:
/usr/bin/sqlite3 -readonly ~/Library/Application\ Support/Dock/desktoppicture.db 'SELECT * FROM data ORDER BY rowID DESC LIMIT 1 OFFSET 0;'
从"文件夹" 读取壁纸列表时,使用下面的读取文件所在的文件夹,当然“Apple > 颜色”设置单一颜色的时候这个不适用:
/usr/bin/sqlite3 -readonly ~/Library/Application\ Support/Dock/desktoppicture.db 'SELECT * FROM data ORDER BY rowID DESC LIMIT 1 OFFSET 1;'
对于 Apple > 桌面图片的选项,第一个命令有的时候管用,但是我的机器是升级过来的,当设定为我升级前就设定的个人指定的动态图的时候,就不适用。而设置之前没有使用的其他系统内置的图的时候,却适用。猜测,这个差异应该是其它表中的数据决定的。
这个数据库中的其他表,应该还与显示器(uuid)及其数目和位置等有关系,没有测试环境无法判断之间的联系。
这个应该有编程的 API 对应,最好是能找到,那样的话会更加准确。
刚才找到了这个github 上的项目macOS Desktop, 有支持自从 10.14 到 12.x 的各个版本的脚本,你可以参考。它有比较详细的解释,花时间应该可以对数据库有很好的理解。
根据我的测试,这个终端命令行在好多情况下工作不太好。
刚才,写了个脚本,它处理了几个常见的情况,但是依然有没有照顾到的情况,毕竟不是通过 API 做的,有时情况有点复杂(规律没有彻底解决),凑合着用,比单个命令好用一点。它也能把文件在 Finder 中显示出来(就是最后一句,如果不需要,可以屏蔽掉最后一句)。
脚本可以从下面得到,你可以轻松地复制粘贴到你的.command文件中:
https://github.com/Tonyliu2ca/Mac-Admin-Scripts/blob/master/bgPicture.sh
Terminal输入 /usr/bin/sqlite3 -readonly ~/Library/Application\ Support/Dock/desktoppicture.db 'SELECT * FROM data ORDER BY rowID DESC LIMIT 1 OFFSET 1;'
得到了壁纸所在文件夹的路径,没有到文件名~……
輸入set theDesktopPic to desktop picture get properties of theDesktopPic
得到了很久之前设置成为单一一张壁纸时的那个文件的全部完整詳細信息,沒有得到當前系統所使用的隨機壁紙的相關信息。😭
在不同電腦上實驗了一下,在設置過一次單一壁紙文件後,display dialog theName 和
reveal theDesktopPic 都可以運行成功了,但是之後系統設置幾次不同的隨機壁紙後,這兩個腳本的結果也都是之前單一壁紙的信息,不會隨(隨機壁紙)設置更新當前最新信息了。
所以之前我報錯是因為DesktopPic下沒有內容,在設置過一次壁紙後就可以了。但是“隨機壁紙”可能又是單獨另一個模塊的新功能,不在傳統的DesktopPic下面。
这个终端命令有的时候也会不灵,如果把 sql 库都清空一下,然后再改动壁纸,使 macOS给它初始化一下后,基本上会好很多。但是,在单独照片和多照片切换多次后,依然有时有问题。再看Sariel的 AppleScript 的也是同样,两个都不是最好的方法。还是要通过系统 API 。
附,清空库的终端命令:
/usr/bin/sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db 'DELETE FROM preferences; DELETE FROM pictures;'
太羡慕这种技术带来的快乐了,可以自己搞这么酷的事情。实际日常工作生活中大部分的电脑操作其实都应该可以用脚本批处理来实现,简化繁琐重复的无谓操作,可惜自己对代码一窍不通,生活压力大又没时间学。
前几次运行失败,因为实际壁纸目录是
/Users/Lineage/Pictures/desktoppicture/
但,OFFSET 1 得到结果却是
300.0
于是
path=[300.0/3027_n.jpg]
The file /Users/Lineage/300.0/3027_n.jpg does not exist.
重新系统设置壁纸换到别的,再换回原目录(/Users/i7/Pictures/desktoppicture/),OFFSET 1 得到
5
于是path=[300.0/2739_n.jpg],文件不存在
第三次得到结果 0.0
于是 path=[0.0/1389_n.jpg],文件不存在
第四次得到正确结果,运行成功,之后又反复变换设置了五次,结果全部正确,Finder欢快的跳了出来指给我结果,太酷了。
看看这个 blog,是不是你想要的,另外这个有点老了,2009 年的,不知道是否还适用。
https://joshmadison.com/2009/03/30/getting-the-current-desktop-background-in-os-x/
运行“Script Editor.app”(脚本编辑器.app),它在“/System/Applications/Utilities/”文件夹中。新建 》粘贴代码,三角运行即可。
感谢回复。可惜System Events發生錯誤:無法取得「property list file \"Macintosh HD:Users:Library:Preferences:com.apple.desktop.plist\"」。" number -1728 from property list file "Macintosh HD:Users:Library:Preferences:com.apple.desktop.plist"
不知道在您的电脑上运行成功了吗?
这个纽约大神13年前跟我的想法完全一样,可以现在好像转行做摄影博主了,要是有人能够将这个代码适配新系统就完美了。非常感谢!
感谢大神回复。可惜 error "無法取得「displayed name of missing value」。" number -1728 from displayed name of missing value
不知道在您的电脑上是否运行成功了?
看到这篇帖子下的前辈好像也没有成功,检索了一下关于Catalina之后AppleScript就出现了类似的问题,尝试在系统安全Full Disk Access中添加Image Events,还是不行。是不是 2016 年以后苹果就停掉了 Mac Automation?从而导致AppleScript无法再起作用了?如果新版本系统能够运行这个脚本的话,真的是非常酷非常实用啊。
感谢大神再次回复。
有没有办法获取当前电脑壁纸的文件名?