Aktualizacja Uwaga:
Moja pierwotna odpowiedź, pokazana poniżej, została napisana przy użyciu ogólnego przykładu, a nie rzeczywistego celu, ponieważ nie została jeszcze ujawniona. Raz został ujawniony w komentarzu, Pobrałem CopyClip 2 i napisał AppleScript kod za pomocą interfejsu użytkownika skryptów , aby otworzyć zaawansowane Preferencje okienko , kliknij Usuń wszystkie klipy przycisk , późniejsze Delete All przycisk , zamknij ten Preferencje okno i zamknąć Interfejs użytkownika pokazujący klipy. Działa, jednak jest to Skrypt UIi widzisz to tak, jakby robiono to ręcznie, ale dzieje się to znacznie szybciej i bez widocznych ruchów myszy na ekranie. (Niezupełnie rozwiązanie w tle ).
Jednak powiedziano mi, że CopyClip 2 jest bardzo niestabilny i zawieszał się co drugi lub kilka razy, kiedy uruchamiałem skrypt , i dlaczego nie publikuję kodu, chyba że naprawdę chcesz go zobaczyć. Więc nie polecam metody skryptowania interfejsu użytkownika . Zauważ, że wyrażona niestabilność była po prostu połączona z użyciem AppleScript w aplikacji, a nie jej ogólnym użyciem. (Właściwie nie użyłem go inaczej niż do odpowiedzi na pytanie).
Szukając teraz rozwiązania w tle , zbadałem, jak CopyClip 2 przechowuje klipy, i znalazłem, gdzie był magazyn danych klipów iw jakiej formie. Nic dziwnego, że jest przechowywany w bazie danych SQLite . Dzięki tym informacjom widzę dwie różne opcje:
Pierwszy polega na manipulowaniu danymi przechowywanymi w bazie danych SQLite . Problem polega na tym, że nie zajmuję się programowaniem w języku SQL , więc musiałbyś sam skorzystać z tej opcji.
Druga opcja jest raczej metodą quasi-brute-force, ale działa dobrze i nie spowodowała awarii aplikacji. Polega ona na programowym wyjściu z CopyClip 2 , usunięciu bazy danych klipów i ponownym uruchomieniu CopyClip 2 .
Każda z tych opcji byłaby uważana za metodę tła , szczególnie w porównaniu do korzystania ze skryptów interfejsu użytkownika .
Poniższy przykładowy kod skryptu BASH jest tym, czego użyłem dla drugiej wspomnianej opcji. Można go uruchomić na wiele różnych sposobów.
#!/bin/bash
if [ -n "$(pgrep "CopyClip 2")" ]; then
pkill "CopyClip 2"
sleep 1.5
for i in $HOME/Library/Containers/com.fiplab.copyclip2/Data/Library/Application\ Support/CopyClip/*; do
rm "$i" 2>/dev/null
done
open -a "CopyClip 2"
fi
Po raz pierwszy przetestowane pół kilkanaście razy w Terminalu jako wykonywalnego BASH skryptu przed użyłem kodu w Run Shell Script działania w Automator aplikacji i przetestowane kolejne pół kilkanaście razy. W przypadku moich 2 centów jest to sposób, w jaki starałbym się wykonać opcję programowania SQL , nawet gdybym znał SQL .
Zapisany jako aplikacja Automator , np. Usuń wszystkie klipy CopyClip , użyłem Spotlight, aby go znaleźć i wykonać, tj .:
CommandSpacedelEnter
Aplikacja może być także umieszczony w stacji dokującej dla szybkiego kliknięcia myszy , aby usunąć wszystkie pliki zbyt.
Nawiasem mówiąc, mam również opcję Ukryj okno podczas uruchamiania ustawione na WŁ. Na karcie Ogólne w Preferencjach dla CopyClip 2 , aby wyglądało jak tło w tle . W ten sposób, chyba że patrzysz bezpośrednio na ikonę paska menu dla CopyClip 2 , tak naprawdę nie zauważysz, że został zamknięty i ponownie otwarty.
Należy również pamiętać, że baza danych klipów jest zwykle tworzona przy pierwszym uruchomieniu i tylko zmiany są zapisywane lub usuwane przez CopyClip 2 . Sprawdziłem bazę danych klipów za pomocą SQLiteBrowser, kiedy ją utworzono po raz pierwszy i po usunięciu wszystkich klipów, a jej struktura zasadniczo nie różni się od tej po pierwszym utworzeniu 1 , więc wielokrotne usuwanie bazy danych klipów naprawdę nie stanowi problemu do osiągnięcia celu.
( 1 Chociaż technicznie istnieją pewne różnice, usunięte dane nie zostały jeszcze usunięte z bazy danych za pomocą komendy VACUUM, jednak ta opcja jest wyjątkowo bezpieczna i nie powinna stanowić problemu przy wielokrotnym użyciu).
Oryginalna odpowiedź:
Korzystanie z nagrywania przycisk w Automator , masz nagrany kilka kliknięć myszką na pasku menu i to produkowane Watch Me Wykonaj działanie w obiegu . Następnie uruchom przepływ pracy Automatora zawierający akcję Obejrzyj mnie , aby użyć słów, gra się jak film.
Więc pytasz, czy to może działać w tle bardziej jak makro Excela, a potem grać jak film?
Ogólnie rzecz biorąc, krótka odpowiedź brzmi: tak i nie ... tak bardziej przypomina makro (w pewnym sensie), ale nie nie w tle.
To powiedziawszy, należy jednak pamiętać, że w zależności od docelowej aplikacji i tego, co należy zrobić, może istnieć możliwość zakodowania czegoś do wykonania w tle, ale bez znajomości wyraźnej specyfiki wykracza to poza zakres tej ogólnie mówiąc krótkiej odpowiedzi.
Dłuższa odpowiedź jest, aby przekształcić Watch Me Do działań w odpowiednim AppleScript kodu . Ponieważ jednak korzysta ze skryptów interfejsu użytkownika, nie może działać w tle, ale może działać znacznie wydajniej i szybciej niż odtwarzana akcja Watch Me Do, a na ekranie nie widać ruchów myszy wizualnej. Oznacza to, że po uruchomieniu kodu AppleScript , niezależnie od tego, który sposób wybierzesz, musisz pozwolić skryptowi na nieprzerwane przetwarzanie kodu , co stanowi jedną z wad skryptów interfejsu użytkownika .
Uważam jednak, że będzie to bardziej pożądane niż granie w film i widzenie myszy poruszającej się po ekranie.
Jako przykład, zapis moich działań podczas korzystania z zegara na pasku menu w tym przykładzie, mam zamiar kliknąć na zegar pozycję menu , a następnie kliknij na otwarcia Data & Czas Preferencje ... element menu , a następnie kliknij w Zamknij przycisk na Date & Time Preferencje okienko z preferencji systemowych , który jest otwarty w wyniku poprzednich dwóch kliknięć .
W Automator , wybiorę trzy Imprezy w Watch Me Do działania , a następnie naciśnij przycisk CommandC, aby skopiować te zdarzenia do schowka.
Teraz otwórz Script Editor oraz w nowym dokumencie , naciśnij przycisk CommandV , aby wkleić skopiowane wydarzenia ze schowka.
Spowoduje to wygenerowanie kodu AppleScript pokazanego na samym końcu tej odpowiedzi, który jest tam umieszczony, ponieważ niewiele z niego zostanie faktycznie wykorzystanych, ale będzie zawierał kluczowe fragmenty kodu , więc nie trzeba ręcznie wpisywać całego gotowego kodu i jest tu zawarte tylko dla kompletności tego przykładowego przypadku.
W wklejonym kodzie znajdują się trzy polecenia reprezentujące rzeczywiste zdarzenia kliknięcia , a ponieważ używa ono skryptów interfejsu użytkownika , są one wykonywane przez zdarzenia systemowe .
Tak więc w innym nowym dokumencie , w edytorze skryptów , dodaję tell application "System Events"
blok , np .:
tell application "System Events"
end tell
W tym bloku informacyjnym skopiowałem odpowiednią część trzech zdarzeń kliknięcia z kodu wklejonego w innym dokumencie, jednocześnie usuwając niepotrzebny kod i ukośniki odwrotne dla tego przypadku użycia, np .:
tell application "System Events"
click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
click UI element 1 of window "Date & Time" of application process "System Preferences"
end tell
Ponieważ jest to Skrypt UI , należy dodać odpowiednie delay
polecenia , np .:
tell application "System Events"
click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
delay 0.5
click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
delay 2.5
click UI element 1 of window "Date & Time" of application process "System Preferences"
end tell
Teraz, gdy mógłbym uruchomić powyższy kod (a nawet pierwotnie wklejony kod ) i powinien on działać poprawnie w tej chwili, problem polega na tym menu bar item 7
, że obecnie zegar w moim systemie może się zmienić. Tak samo w niektórych przypadkach można również menu item n
zmienić, choć nie w tym przypadku. Jednak wiedząc o tym, przepiszmy kod, aby nie był zakodowany na stałe na numer pozycji paska menu lub numer pozycji menu :
tell application "System Events"
-- click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
click (every menu bar item of menu bar 1 of application process "SystemUIServer" whose description is "clock")
delay 0.5
-- click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
click (every menu item of menu 1 of (every menu bar item whose description is "clock") ¬
of menu bar 1 of application process "SystemUIServer" whose title is "Open Date & Time Preferences…")
delay 2.5
-- click UI element 1 of window "Date & Time" of application process "System Preferences"
-- click button 1 of window 1 of application process "System Preferences"
quit application "System Preferences"
end tell
W kodzie powyżej, oryginalne trzy wiersze kodu zostały wykomentowane, czyli --
dodano przed każdym wierszu. Również oryginalny trzeci wiersz ma pod komentarzem dodatkowy wiersz, ale został dodany, aby pokazać, jak uogólnić oryginalny trzeci wiersz. Jednakże, ponieważ jego celem w tym przypadku było zamknąć Preferencje systemowe , po prostu powiedz jej rzucić zamiast.
Ostateczna przykładowa wersja kodu do obsługi trzech zdarzeń, które miały miejsce w przykładowej akcji Watch Me Do w Automatorze :
try
tell application "System Events"
click (every menu bar item of menu bar 1 of application process "SystemUIServer" whose description is "clock")
delay 0.5
click (every menu item of menu 1 of (every menu bar item whose description is "clock") ¬
of menu bar 1 of application process "SystemUIServer" whose title is "Open Date & Time Preferences…")
delay 2.5
quit application "System Preferences"
end tell
end try
Teraz porównując ostatnią przykładową wersję powyższego kodu z oryginalnym kodem pokazanym poniżej, widać różnicę i to, co jest konieczne do wyczyszczenia oryginalnego kodu , nie kodując na stałe numeru pozycji paska menu ani numeru pozycji menu , dzięki czemu jest bardziej inteligentny następnie przy użyciu Watch Me do działań w Automator .
Uwaga: przykład AppleScript kod powyżej jest tak, że i sans otoczenie go w try
oświadczeniu , nie zawiera żadnej innej obsługi błędów , jakie mogą być właściwe / potrzebne / chciał, spoczywa na użytkownika, aby dodać dowolną odpowiednią obsługi błędów dla każdego przykładu kod przedstawiony i / lub kod napisany przez siebie. Obejmuje to ustawienie wartości z delay
komendy odpowiednio do czasu na jedynek własnego systemu.
Dodatkowo, nie wszystkie pozycje menu są tak łatwe do napisania w skrypcie, jak w tym przykładzie, a w niektórych przypadkach może nie działać dobrze nawet przy użyciu tej metody, to po prostu zależy i jest jednym z powodów, dla których starałem się uzyskać od ciebie bardziej wyraźne i konkretne informacje w moje komentarze. Oznacza to, że mogłem dać ci wyraźny i konkretny kod dla twojej natychmiastowej potrzeby, zamiast pisać odpowiedź na przykładzie. Chociaż mam nadzieję, że ten przykład przyda się także innym.
Oryginalny AppleScript kod generowany podczas imprezy zostały skopiowane i wklejone z Watch Me Wykonaj działania w Automator w tym przypadku przykład zastosowania:
-- Click the “clock” menu bar item.
delay 0.249747
set timeoutSeconds to 0.500000
set uiScript to "click menu bar item 7 of menu bar 1 of application process \"SystemUIServer\""
my doWithTimeout( uiScript, timeoutSeconds )
-- Open Date & Time Preferences…
delay 0.186764
set timeoutSeconds to 0.500000
set uiScript to "click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process \"SystemUIServer\""
my doWithTimeout( uiScript, timeoutSeconds )
-- Click the “<fill in title>” button.
delay 0.509640
set timeoutSeconds to 0.500000
set uiScript to "click UI Element 1 of window \"Date & Time\" of application process \"System Preferences\""
my doWithTimeout( uiScript, timeoutSeconds )
on doWithTimeout(uiScript, timeoutSeconds)
set endDate to (current date) + timeoutSeconds
repeat
try
run script "tell application \"System Events\"
" & uiScript & "
end tell"
exit repeat
on error errorMessage
if ((current date) > endDate) then
error "Can not " & uiScript
end if
end try
end repeat
end doWithTimeout