如何使用 "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
标志将 always 为 true
无论其初始状态如何。因此:
第一个观察突出了我上面提到的两个脚本的功能之间的差异,因为系统事件命令将切换 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
第二个观察结果意味着读取“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
的单一调用并删除其他所有内容。
塞拉利昂脚本:
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
标志将 always 为 true
无论其初始状态如何。因此:
第一个观察突出了我上面提到的两个脚本的功能之间的差异,因为系统事件命令将切换 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
第二个观察结果意味着读取“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
的单一调用并删除其他所有内容。