Applescript 从停靠栏中删除项目

Applescript to remove items from dock

我正在尝试从 Dock 中删除(所有)项目。我可以像这样按名称删除它们:

tell application "System Events"
    tell UI element "Launchpad" of list 1 of process "Dock"
        perform action "AXShowMenu"
        click menu item "Remove from Dock" of menu 1
    end tell
end tell

但我想拉出当前项目的列表并迭代它们。 This stack overflow question 似乎涵盖了如何获取列表。我想做的是调整上面的代码以在循环内运行。我猜想在循环内引用列表的当前项将使用 "thisRecord" 完成。我想我误解了如何将 "thisRecord" 转换为我可以在系统事件中引用的内容。

set plistpath to (path to preferences folder as text) & "com.apple.dock.plist"

tell application "System Events"
    set plistContents to contents of property list file plistpath
    set pListItems to value of plistContents
end tell
set persistentAppsList to |persistent-apps| of pListItems

set dockAppsList to {}
repeat with thisRecord in persistentAppsList
    set end of dockAppsList to |file-label| of |tile-data| of thisRecord
    tell application "System Events"
        tell UI element application thisRecord
            perform action "AXShowMenu"
            click menu item "Remove from Dock" of menu 1
        end tell
    end tell
end repeat  

最好先备份 "com.apple.dock.plist" 文件。以下两行 AppleScript 代码会将您当前的 com.apple.dock.plist 文件复制到您的桌面。如果您想将 Dock 图标恢复到您之前的状态,这将派上用场 运行 此 post.

的第二个脚本
set plistpath to (path to preferences folder as text) & "com.apple.dock.plist"
tell application "Finder" to duplicate alias plistpath to desktop

此 AppleScript 代码适用于使用最新版本的 macOS Mojave 的我。

set plistpath to (path to preferences folder as text) & "com.apple.dock.plist"

tell application "System Events"
    set plistContents to contents of property list file plistpath
    set pListItems to value of plistContents
end tell
set persistentAppsList to |persistent-apps| of pListItems

set dockAppsList to {}
-- Gets app names and adds them to dockAppsList
repeat with i from 1 to count of persistentAppsList
    set thisItem to item i of persistentAppsList
    set appName to |file-label| of |tile-data| of thisItem
    set end of dockAppsList to appName
end repeat

-- Loops through each app in dockAppsList and removes each app from Dock
repeat with thisRecord in dockAppsList
    tell application "System Events"
        tell UI element thisRecord of list 1 of process "Dock"
            try
                perform action "AXShowMenu"
                click menu item "Options" of menu 1
                click menu item "Remove from Dock" of menu 1 of menu item "Options" of menu 1
            on error
                try
                    perform action "AXShowMenu"
                    click menu item "Remove from Dock" of menu 1
                end try
            end try
        end tell
    end tell
end repeat

我意识到我可以将所有内容都包含在一个大的重复循环中。我认为,为了这个脚本的目的,最好将两个循环事件分开,以防您在脚本中的其他地方可能想要返回 dockAppsList 的项目,而不是 "removing all from the dock"您可能只想从停靠栏中删除 dockAppsList 的第 1 到 5 项。

作为替代方案...这是一种更直接的方法,用于删除 persistent-apps Dock 上的持久性应用程序com.apple.dock.plist 文件的密钥

终端,执行以下操作首先备份目标文件:

  1. cd ~/Library/Preferences
  2. cp -a com.apple.dock.plist com.apple.dock.plist.bak

现在删除持久性应用程序,使用以下复合命令

defaults delete com.apple.dock persistent-apps; killall Dock

如果以后要恢复备份,请使用以下复合命令

 cd ~/Library/Preferences; rm com.apple.dock.plist; cp -a com.apple.dock.plist.bak com.apple.dock.plist; killall Dock

如果出于某种原因您需要使用 AppleScript 执行此操作,您可以使用 do shell script 命令 来 运行 这些 shell 命令.


注意:在您的 OP 中您声明 "I'm trying to remove (all) items from the dock." 并且您提供的 代码 仅关注存储在 persistent-apps [=36] 下的应用程序=]键。还有其他 项目 可以在 Dock 上显示,第一个是默认的 persistent-others,它有 下载 堆栈 和您添加到该部分的其他项目。然后使用 macOS Mojave recent-apps 显示在 上的两个上述部分之间(按 key 名称)码头。同样的前提也可以用在这些 keys 上,用 persistent-othersrecent-apps 代替 defaults delete ... [=36] 中的 persistent-apps =]复合命令.