AppleScript从码头删除项目

时间:2019-05-13 23:28:35

标签: automation applescript 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  

2 个答案:

答案 0 :(得分:1)

首先备份“ com.apple.dock.plist”文件可能是明智的。以下这两行AppleScript代码会将您当前的com.apple.dock.plist文件复制到您的桌面。如果您想将Dock图标恢复为运行本博文的第二个脚本之前的样子,这将很方便。

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的项目,而不是“从停靠”,您可能只想从停靠中删除dockAppsList的项目1至5。

答案 1 :(得分:1)

作为一种替代方法...这是一种更直接的方法,用于删除在工具的persistent-apps 中找到的 Dock 上的持久性应用程序。 com.apple.dock.plist个文件:

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

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

现在要删除永久性应用,请使用以下 compound命令

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

如果以后要还原备份,请使用以下 compound命令

 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中,您说过“我正在尝试从扩展坞中移除(所有)物品。”您提供的 code 仅关注存储在persistent-apps 下的应用。另外,还可以在 Dock 上显示其他 items ,第一个是默认的persistent-others,其中包含 Downloads stack 和您添加到该部分的其他项目。然后使用 macOS Mojave ,在{strong> Dock 上的上述两个部分之间(按 key 名称)显示recent-apps。同样可以在这些上使用相同的前提,在persistent-others compound命令中用recent-appspersistent-apps代替defaults delete ... / em>。