Как объединить 2 apple-скрипта, используя «sw_vers»? один скрипт для sierra и другой скрипт для других mac os?

#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 независимо от его начального состояния. Поэтому:

  1. Первое замечание подчеркивает несоответствие между функциональностью ваших двух скриптов, о которых я упоминал выше, потому что команда 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
     
  2. Второе наблюдение означает, что нет смысла считывать значение 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