如何使用 "sw_vers" 组合 2 个苹果脚本?一个用于 sierra 的脚本和另一个用于其他 mac os 的脚本?

How to combine 2 apple-scripts using "sw_vers"? one script for sierra and other script for other mac os's?

塞拉利昂脚本:

    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 && /System/Library/CoreServices/VoiceOver.app/Contents/MacOS/VoiceOverStarter"
end if

用于其他 macOS 的脚本:

tell application id "com.apple.systemevents" to key code 96 using command down

有原生获取系统版本的方法

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 && /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

你的两个脚本之间的区别比它们的内容暗示的更重要。首先,他们做不同的事情:第一个(如果它没有丢失其初始 try 块开启者)将 VoiceOver 的 doNotShowSplashScreen 标志设置为 true,然后启动 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。不太明显的一点是,在脚本结束时,VoiceOver 的 doNotShowSplashScreen 标志将 alwaystrue 无论其初始状态如何。因此:

  1. 第一个观察突出了我上面提到的两个脚本的功能之间的差异,因为系统事件命令将切换 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. 第二个观察结果意味着读取“Sierra”脚本开头的 doNotShowSplashScreen 标志的值毫无意义,因此您可以一起取出整个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 key/value 对的书写,我很想坚持对 do shell script 的单一调用并删除其他所有内容。