AppleScript在High Sierra正常Monterey下查找文件失效排查
问题产生原因
问题来自系统权限机制变更、原代码逻辑缺陷两方面,旧系统能运行是因为老版AppleScript接口容错性高,新版系统不再兼容不规范写法:
- 权限层面:macOS从Mojave版本开始逐步收紧沙箱权限,到Monterey版本时,访问用户域下的
Library文件夹必须获得用户明确的访问授权,旧版本无该强校验,未授权也可读取文件夹内容,新版本会直接拦截无权限的读取请求。 - 代码逻辑层面:原代码在遍历
deleted123文件列表的循环中,执行了往deleted123列表尾部追加内容的操作,属于遍历过程中修改原列表的错误写法;且追加的内容是文件引用拼接换行符生成的字符串,和列表里原本存储的Finder文件引用类型完全不一致。High Sierra版本下Finder的AppleScript实现容错性高,不会触发异常,Monterey版本下Finder的AppleScript接口做了重构,对这类非法操作、类型不匹配问题会直接中断遍历流程,导致无法正确返回匹配的文件列表;此外原代码中if exists (deleted123)属于无效判断,deleted123是脚本内定义的列表变量,赋值完成后始终存在,该判断没有实际作用。
改进后的可运行代码
-- 定义目标文件夹路径 set myFolder to (((path to library folder from user domain) as string) & "FOLDER") as alias tell application "Finder" -- 显式指定匹配name属性,避免新版属性解析兼容问题 set matchedFiles to every file of folder myFolder whose name contains "abc" -- 遍历匹配到的文件,遍历过程不修改原列表 repeat with oneFile in matchedFiles -- 此处填写对单个文件的操作逻辑,比如打开、移动、删除等 end repeat -- 匹配到文件时执行批量逻辑 if matchedFiles ≠ {} then -- 此处填写对所有匹配文件的批量操作逻辑 end if end tell
注意事项
- 首次运行脚本时,系统会弹出权限申请弹窗,请求访问对应文件夹的权限,点击允许即可正常运行;如果误点拒绝,可以到「系统设置-隐私与安全性」中,给运行脚本的工具(比如脚本编辑器、快捷指令)开启对应文件夹的访问权限。
- 如果需要遍历目标文件夹下所有子文件夹内的文件,可以把获取文件的语句改成
set matchedFiles to every file of entire contents of folder myFolder whose name contains "abc",文件夹内文件较多时该操作会耗时较长。
内容的提问来源于stack exchange,提问作者Niamh Doyle
相关产品推荐
相关产品推荐

