考虑以下 AppleScript:
on is_running(appName)
tell application "System Events" to (name of processes) contains appName
end is_running
set safRunning to is_running("Safari")
if safRunning then
tell application "Safari"
-- Stuff I only want executed if Safari is running goes here.
end tell
return "Running"
else
return "Not running"
end if
问题:当我通过osascript
命令行实用程序运行它时,如果 Safari 没有运行,它会启动并且脚本报告“正在运行”。这不是我想要或期望的行为。请注意,在 AppleScript 编辑器中运行时,它可以按预期/预期工作。
这是一个osascript
错误/已知问题吗?还是出于我失踪的原因,它是某种有意的行为?任何人都可以让它按要求工作吗?(顺便说一句,我正在运行 OSX 10.7.5;我看不到如何osascript
报告版本号)。
如果您注释掉tell
/end tell
行,它的行为与我预期的一样:如果 Safari 没有运行,它不会启动它,并打印“未运行”。所以在我看来,这似乎tell
是导致 Safari 启动的原因,但它不需要实际执行,只需存在于脚本中......?有一段时间我想知道这tell
是否应该是这样工作的,但由于它在 AppleScript 编辑器中不能这样工作,我猜不是......
事实上,这是另一个具有类似行为的更疯狂的版本:
on is_running(appName)
tell application "System Events" to (name of processes) contains appName
end is_running
set safRunning to is_running("Safari")
return safRunning
if false then
tell application "Safari"
end tell
end if
这仍然总是启动 Safari,即使在 return 语句之后的块内tell
!if false
(但同样,这在 AppleScript 编辑器中很好。)
顺便说一句,这种行为不仅限于 Safari,而且也不是通用的:
- 受影响的应用程序包括:Safari、TextEdit、iPhoto、AppleScript Editor、iTerm、...
- 不受影响的应用程序包括:谷歌浏览器、iTunes、预览、邮件、终端、地址簿、Echofon、...
那么,有人对我如何解决或绕过这个有任何想法吗?这是一个osascript
错误吗?还是我错过了有关 AppleScript 语义的内容?
对于上下文:我正在尝试编写一个脚本(要嵌入/从某些 python 调用),它会在打开的浏览器中查询它们打开的任何选项卡的 URL;我一切正常,除了它总是启动 Safari,无论它是否打开。我已经将这种不良行为归结为上面显示的简单测试用例。我不知道有任何方法可以在不使用的情况下从 python 运行此脚本osascript
,除了appscript 之外,我不想使用它,因为它不再是开发/支持/推荐的。
非常感谢所有输入/见解!