You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AppleScript启动时运行正常,一段时间后停止工作的问题求助

解决AppleScript电池检测脚本运行一段时间后停止的问题

你编写的AppleScript脚本用于根据电池充电状态控制AlDente应用启停,启动时正常,但运行一段时间后会停止工作,在Script Editor中运行则无报错且表现正常。以下是问题分析和修复方案:

问题原因

  1. 递归调用导致栈溢出:原脚本通过batteryStatusChanged()自身递归实现循环,随着运行时间增加,调用栈会持续累积,最终因栈溢出导致脚本终止。
  2. do shell script未处理错误:当pmset -g batt输出中没有"charging"关键字时,grep 'charging'会返回非零退出码,此时do shell script会抛出错误,直接中断脚本执行。
  3. 函数定义不符合语法规范: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做条件判断,代码更简洁清晰。

开机自动运行设置

若需要脚本开机自动启动:

  1. 在Script Editor中打开修复后的脚本,选择菜单文件 -> 导出,文件格式选择应用程序。
  2. 打开系统设置 -> 通用 -> 登录项,点击+按钮,添加刚导出的应用程序。
  3. 前往系统设置 -> 隐私与安全性 -> 自动化,给该应用授予控制"System Events"和"AlDente"的权限。

内容的提问来源于stack exchange,提问作者Ruvimbo Dube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:32:22