【问题标题】:Get return values from Applescript in Swift在 Swift 中从 Applescript 获取返回值
【发布时间】:2015-05-11 09:22:07
【问题描述】:

是否可以在 Swift 中运行 Applescript 并接收返回值? 我有一个类似下面的脚本。如何快速运行它并接收返回值?

global frontApp
set windowTitle to "
tell application "System Events"
    set frontApp to first application process whose frontmost is true
end tell
return {frontApp}

我的代码如下

var set: String = "set windowTile to \"\"\n"
var tell: String = "tell application \"System Events\"\n"
var setFrontApp: String = "set frontApp to first application       
                           process whose frontmost is true\n"
var setFrontAppName: String = "set frontAppName to name of frontApp\n"
var tellProcces: String = "tell process frontAppName\n"
var tellFirst: String = "tell (1st window whose value of attribute          
                              \"AXMain\" is true)\n"
var setWindowTitle: String = "set windowTitle to value of 
                               attribute \"AXTitle\"\n"
var endTellFirst: String = "end tell\n"
var endTellProcess: String = "end tell\n"
var endTell: String = "end tell"
var startAtLoginScript: NSAppleScript = NSAppleScript(source: tell 
                                        + deleteItem + endTell)!
startAtLoginScript.executeAndReturnError(errorInfo)

你能告诉我我的结果应该在哪里或者我做错了什么吗?如果我打印出 errorInfo 或跟踪结果是一些奇怪的数字。

【问题讨论】:

  • 谢谢马特。我见过这个。但是,您给出了一个简短的代码示例,如何运行脚本并在 swift 数组中接收数据?我可以发布我的方法,但结果很奇怪。

标签: macos swift applescript


【解决方案1】:

NSAppleScript 是一堆几乎没用的垃圾。如果您想将自己的 AppleScript 代码集成到您的 ObjC/Swift 项目中,请使用 AppleScript-ObjC 桥接器,它使用标准 ObjC 消息传递并在大多数 AS 类型与其 Foundation 等效项之间提供自动桥接:

http://appscript.sourceforge.net/asoc.html

http://macscripter.net/viewtopic.php?pid=175562#p175562

如果要执行用户提供的脚本,一般要使用NSUserAppleScriptTask。从功能上讲,它甚至比NSAppleScript(不支持持久性)更糟糕;但是,它对沙盒友好,而 NSAppleScript(在进程内运行)则不是。

https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSUserAppleScriptTask_Class/

【讨论】:

  • 我最初的问题不仅是运行脚本 put 还保留输出值。 NSAppleScript 或 NSUserAppleScriptTask 是否有可能?
  • 所有这些都是可能的。但是你为什么要使用 NSAppleScript/NSUserAppleScriptTask,它要求你完成将 AppleScript 值转换为它们的 Cocoa 等价物的所有繁琐工作,而 AppleScript-ObjC 将为你完成所有这些工作?
  • 我真的不明白 AppleScript-ObjC 是如何为我完成所有工作的。我必须创建多个文件(桥接头等)我拥有的代码可以以一种方法运行,但我怎样才能获得返回值?
  • 嗯,你意识到 -[NSAppleScript executeAndReturnError:] 返回一个结果,是吗?这会将脚本的结果作为 NSAppleEventDescriptor (如果成功,如果不成功,则返回 nil),然后您必须自己解包。顺便说一句,值得研究的另一件事是 OS X 的 Accessibility API,它完全避免了与 AppleScript 和系统事件(它只是这些 API 的包装器)搞混的需要。 HTH
  • 感谢您的帮助。我只是很难找到例子。如果我查看 Apple 的文档,我仍然很难从中构建代码。如果我能看到代码示例,我会更容易理解。
【解决方案2】:

实际上,let text = startAtLoginScript.stringValue 不起作用,因为 NSAppleScript 没有名为“stringValue”的成员。但是,您可以这样做:

let text = startAtLoginScript.executeAndReturnError(errorinfo)!.stringValue!

这将返回脚本的输出,或者,如果出现错误,则返回 errorinfo 中的任何内容。

【讨论】:

    【解决方案3】:

    如果找到我的问题的解决方案。

    let text = startAtLoginScript.stringValue
    

    这就是我可以解析结果的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多