将变量传递给 AppleScript

And*_*rew 4 macos xcode applescript objective-c

在 Xcode 中运行我的 AppleScript 的代码如下:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Script" ofType:@"scpt"];

NSAppleScript *script = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];

[script executeAndReturnError:nil];
Run Code Online (Sandbox Code Playgroud)

在执行它之前,我想知道是否可以设置一些变量供它使用。换句话说,我想将变量从我的应用程序传递给 AppleScript。

pka*_*amb 5

我找到的最好的例子是来自 Quinn“The Eskimo!”的这段代码。在 Apple 开发者论坛上:

https://forums.developer.apple.com/thread/98830

苹果脚本文件:

on displayMessage(message)  
    tell application "Finder"  
        activate  
        display dialog message buttons {"OK"} default button "OK"  
    end tell  
end displayMessage 
Run Code Online (Sandbox Code Playgroud)

从 Swift 调用 AppleScript 方法,传递参数:

import Carbon

// ...

let parameters = NSAppleEventDescriptor.list()
parameters.insert(NSAppleEventDescriptor(string: "Hello Cruel World!"), at: 0)

let event = NSAppleEventDescriptor(
    eventClass: AEEventClass(kASAppleScriptSuite),
    eventID: AEEventID(kASSubroutineEvent),
    targetDescriptor: nil,
    returnID: AEReturnID(kAutoGenerateReturnID),
    transactionID: AETransactionID(kAnyTransactionID)
)
event.setDescriptor(NSAppleEventDescriptor(string: "displayMessage"), forKeyword: AEKeyword(keyASSubroutineName))
event.setDescriptor(parameters, forKeyword: AEKeyword(keyDirectObject))

let appleScript = try! NSUserAppleScriptTask(url: yourAppleScriptFileURL)
appleScript.execute(withAppleEvent: event) { (appleEvent, error) in
    if let error = error {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)


ser*_*gio 4

你可以使用以下方法:

- (id)initWithSource:(NSString *)source
Run Code Online (Sandbox Code Playgroud)

并用于stringWithFormat构建您的 applescript 源并设置参数。

NSString* scriptTemplate = ...;
NSString* actualScript = [NSString stringWithFormat:scriptTemplate, arg1, arg2, ... argN];
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:actualScript];
Run Code Online (Sandbox Code Playgroud)

您还可以设计一种更高级的替换机制,在“Script.scpt”中以某种方式标记参数,然后使用替换它们stringByReplacingOccurrencesOfString:withString:

  • 这种解决方案并不好,因为它会导致每次都重新编译脚本,这可能效率低下。这不是问题所要求的真正的参数传递。更合适的答案在这里:http://stackoverflow.com/questions/6963072/execute-applescript-from-cocoa-app-with-params (4认同)