AppleScript如何让嵌套操作不受外层tell语句作用域影响
AppleScript 外层tell作用域命令寻址问题解决方案
问题根因
你遇到的报错和ignoring application responses无关:这个语句的作用仅为忽略目标应用的响应超时、不等待命令返回结果,完全不会改变命令的发送目标。外层嵌套的tell application "System Events"、tell application process myApp会给块内所有未显式指定执行目标的命令,自动加上当前tell对象的隐含前缀,导致POSIX file、current date这类标准AppleScript原生命令,被错误发送给目标应用进程执行,最终触发寻址错误。
解决方案
方案1:用tell current application块强制指定执行目标
将不需要外层tell作用域的代码包裹在tell current application块内,强制块内所有命令由AppleScript运行时本身执行,不受外层tell作用域影响:
set myApp to "someApp" set pPath to POSIX file "/Volumes/myDisk/outputPath" tell application myApp to activate tell application "System Events" tell application process myApp tell window myApp --some code here repeat while progress indicator 1 of sheet 1 exists -- 强制块内命令由脚本本身执行 tell current application -- 如果确实需要忽略响应可以保留ignoring块,不需要可以直接删除 ignoring application responses set newPath to POSIX file pPath as alias set currentDate to current date end ignoring end tell end repeat --some code here end tell end tell end tell
方案2:提前定义不需要动态计算的变量到外层tell块外
如果部分变量不需要在循环内动态计算,可以提前在外层非tell作用域完成定义,避免进入tell块后寻址错误:
set myApp to "someApp" set pPath to POSIX file "/Volumes/myDisk/outputPath" -- 提前定义不需要动态计算的变量 set newPath to pPath as alias tell application myApp to activate tell application "System Events" tell application process myApp tell window myApp --some code here repeat while progress indicator 1 of sheet 1 exists tell current application set currentDate to current date end tell end repeat --some code here end tell end tell end tell
补充优化技巧
如果仅单个变量/命令需要脱离外层tell作用域,不需要写完整块,给变量添加my前缀即可强制指定为脚本本身的属性/命令:
set currentDate to my (current date) set newPath to my (POSIX file pPath as alias)
内容的提问来源于stack exchange,提问作者userX
相关产品推荐
相关产品推荐

