AppleScript启动时运行正常,一段时间后停止工作的问题求助
解决AppleScript电池检测脚本运行一段时间后停止的问题
你编写的AppleScript脚本用于根据电池充电状态控制AlDente应用启停,启动时正常,但运行一段时间后会停止工作,在Script Editor中运行则无报错且表现正常。以下是问题分析和修复方案:
问题原因
- 递归调用导致栈溢出:原脚本通过
batteryStatusChanged()自身递归实现循环,随着运行时间增加,调用栈会持续累积,最终因栈溢出导致脚本终止。 do shell script未处理错误:当pmset -g batt输出中没有"charging"关键字时,grep 'charging'会返回非零退出码,此时do shell script会抛出错误,直接中断脚本执行。- 函数定义不符合语法规范:
openApp("AlDente")和closeApp("AlDente")这种硬编码参数的函数定义方式不符合AppleScript语法,可能导致潜在的执行异常。
修复后的脚本
on run repeat -- 获取完整电池状态信息,避免grep无匹配时的错误 set batteryInfo to do shell script "pmset -g batt" set isCharging to (batteryInfo contains "charging") if isCharging then openApp("AlDente") else closeApp("AlDente") end if delay 10 -- 调整检测间隔(单位:秒) end repeat end run -- 通用化打开应用的函数,接受应用名称参数 on openApp(appName) tell application "System Events" if not (exists process appName) then tell application appName to activate end if end tell end openApp -- 通用化关闭应用的函数,接受应用名称参数 on closeApp(appName) tell application "System Events" if exists process appName then tell application appName to quit end if end tell end closeApp
修复说明
- 用
repeat循环替代递归:无限循环更适合长期运行的脚本,避免递归调用带来的栈溢出问题。 - 直接判断电池状态:获取完整的电池输出后直接检查是否包含"charging",规避
grep命令无匹配时的执行错误。 - 修正函数定义:将
openApp和closeApp改为接受参数的通用函数,符合AppleScript语法,同时提升脚本复用性。 - 简化逻辑判断:直接使用布尔值
isCharging做条件判断,代码更简洁清晰。
开机自动运行设置
若需要脚本开机自动启动:
- 在Script Editor中打开修复后的脚本,选择菜单
文件 -> 导出,文件格式选择应用程序。 - 打开系统设置 -> 通用 -> 登录项,点击
+按钮,添加刚导出的应用程序。 - 前往系统设置 -> 隐私与安全性 -> 自动化,给该应用授予控制"System Events"和"AlDente"的权限。
内容的提问来源于stack exchange,提问作者Ruvimbo Dube
相关产品推荐
相关产品推荐

