Applescript для удаления предметов из дока - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь удалить (все) предметы из дока.Я могу удалить их по имени, например, так:

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

Но я бы хотел вытащить список текущих элементов и перебрать их. Этот вопрос о переполнении стека , кажется, описывает, как получить список.То, что я хотел бы сделать, это настроить вышеуказанный код для работы внутри цикла.Я предполагаю, что ссылка на текущий элемент списка внутри цикла будет сделана с помощью 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 ]

1 голос
/ 14 мая 2019

В качестве альтернативы ... Вот гораздо более простой подход к удалению постоянных приложений на Док , найденный в persistent-apps ключе файла 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 для запуска этих команд оболочки .


Примечание. В своем ОП вы указали: «Я пытаюсь удалить (все) предметы из дока». а код , который вы представили, фокусируется только на приложениях, хранящихся под клавишей persistent-apps . Есть также дополнительные элементы , которые могут отображаться в Dock , первым по умолчанию является persistent-others, который имеет Downloads stack и другие предметы, которые вы добавили в этот раздел. Затем с macOS Mojave появляется recent-apps, который показывает между двумя вышеупомянутыми секциями (с помощью key name) на Dock . Эти же предпосылки можно использовать и для этих клавиш , заменив persistent-others или recent-apps на persistent-apps в составной команде defaults delete ... .

1 голос
/ 14 мая 2019

Вероятно, было бы целесообразно сначала сделать резервную копию вашего файла "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, поэтому вместо «удаления всего из дока» Вы можете удалить только элементы 1–5 из dockAppsList из дока.

...