#macos #applescript
#macos #эпплскрипт
Вопрос:
сценарий для sierra :
set doNotShowSplashScreen to (do shell script "defaults read com.apple.VoiceOverTraining doNotShowSplashScreen") as integer as boolean
on error
set doNotShowSplashScreen to false
end try
if doNotShowSplashScreen then
do shell script "/System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
else
do shell script "defaults write com.apple.VoiceOverTraining doNotShowSplashScreen -bool true amp;amp; /System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
end if
скрипт для других macos :
tell application id "com.apple.systemevents" to key code 96 using command down
Комментарии:
1.Вы проверяете, под какой версией macOS вы работаете, а затем используете
if
инструкцию для запуска кода на основе этой версии. Взгляните на если Starements. Вы также можете использовать AppleScript, напримерsystem version of (system info)
, вместо команды оболочкиsw_vers
, чтобы получить версию.
Ответ №1:
Различие между вашими двумя скриптами немного более существенно, чем предполагает их содержимое. Во-первых, они делают разные вещи: первый (если бы он не пропускал начальный try
открыватель блоков) устанавливает doNotShowSplashScreen
флаг для VoiceOver true
, затем запускает VoiceOver (т. Е. Включает его); второй запускает VoiceOver (включает его), если он не активен, и завершает VoiceOver (выключает его)если это так.
Более того, do shell script
он был представлен в Mac OS X 10.1. Между тем, системные события не были представлены до Mac OS X 10.6.3. Поэтому второй скрипт будет отлично выполняться в Sierra, но не в чем-либо до Snow Leopard. Первый скрипт должен нормально выполняться в версиях, начиная с Puma.
Я бы рекомендовал рассмотреть актуальность тестирования версии системы и, если вам действительно нужно, действительно ли различия между вашими скриптами отражают эту актуальность.
@user3439894 любезно указал вам на использование system version of (system info)
. AppleScript позволяет проводить числовые сравнения строк версий следующим образом:
set os_sevs_available to true
considering numeric strings
if "10.6.3" > (system info)'s ¬
system version then set ¬
os_sevs_available to false
end considering
или, что эквивалентно:
considering numeric strings
set os_sevs_available to (system info)'s system version ≥ "10.6.3"
end considering
Если вы проработаете логику своего первого сценария, то станет ясно, что конечным результатом в любой ситуации будет выполнение do shell script "/System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
, то есть включение VoiceOver. Чуть менее очевидным является то, что к концу скрипта doNotShowSplashScreen
флаг для VoiceOver всегда будет true
независимо от его начального состояния. Поэтому:
- Первое замечание подчеркивает несоответствие между функциональностью ваших двух скриптов, о которых я упоминал выше, потому что команда System Events переключает VoiceOver. Это можно исправить следующим образом:
if os_sevs_available then if application id "com.apple.VoiceOver" is running then return tell application id "com.apple.systemevents" to key code 96 using command down end if
- Второе наблюдение означает, что нет смысла считывать значение
doNotShowSplashScreen
флага в начале вашего скрипта «Sierra», поэтому вы можете полностью удалить весьtry
блок и отказатьсяif
от тестирования условий ….then
…else
Это позволяет вашему первому сценарию быть сведенным просто к:do shell script "defaults write com.apple.VoiceOverTraining doNotShowSplashScreen -bool true; /System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
Обратите внимание, что это единственная строка, содержащая разрыв строки, что вполне нормально
Я оставлю вас, чтобы определить, действительно ли вам нужны оба этих скрипта. Для меня они оба выглядят так, как будто они будут работать на любой версии системы после 10.6.3, и поскольку единственным функциональным различием между ними сейчас является запись defaults
пары ключ / значение, у меня возникнет соблазн придерживаться одного вызова do shell script
и удалить все остальное.
Ответ №2:
Существует собственный способ получения версии системы
set systemVersion to system version of (system info)
if systemVersion starts with "10.12" then
try
set doNotShowSplashScreen to (do shell script "defaults read com.apple.VoiceOverTraining doNotShowSplashScreen") as integer as boolean
on error
set doNotShowSplashScreen to false
end try
if doNotShowSplashScreen then
do shell script "/System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
else
do shell script "defaults write com.apple.VoiceOverTraining doNotShowSplashScreen -bool true amp;amp; /System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
end if
else
tell application id "com.apple.systemevents" to key code 96 using command down
end if