5

使用 AppleScript,我可以调用 shell 脚本:

do shell script "echo 'Foo & Bar'"

但我找不到在优胜美地脚本编辑器中使用 JavaScript 执行此操作的方法。

4

2 回答 2

5

do shell script是标准脚本添加的一部分,所以这样的东西应该可以工作:

app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript("echo 'Foo & Bar'")
于 2015-01-20T14:47:09.943 回答
2

为了补充 ShooTerKo 的有用答案

调用 shell 时,正确引用命令中嵌入的参数很重要

为此,AppleScript 提供quoted form of了在 shell 命令中安全地使用变量值作为参数,而不必担心 shell 更改值或完全破坏命令。

奇怪的是,从 OSX 10.11 开始,似乎没有 JXA 等效于quoted form of,但是,很容易实现自己的(归功于此评论对另一个答案和calum_b的后来更正):

// This is the JS equivalent of AppleScript's `quoted form of`
function quotedForm(s) { return "'" + s.replace(/'/g, "'\\''") + "'" }

据我所知,这正是 AppleScriptquoted form of所做的。

它将参数括在单引号中,以保护它免受 shell 扩展;由于单引号 shell 字符串不支持转义嵌入的单引号,因此带有单引号的输入字符串被分解为多个单引号子字符串,其中嵌入的单引号拼接在 via\'中,然后 shell 将其重新组装成单个字面量。

例子:

var app = Application.currentApplication(); app.includeStandardAdditions = true

function quotedForm(s) { return "'" + s.replace(/'/g, "'\\''") + "'" }

// Construct value with spaces, a single quote, and other shell metacharacters
// (those that must be quoted to be taken literally).
var arg = "I'm a value that needs quoting - |&;()<>"

// This should echo arg unmodified, thanks to quotedForm();
// It is the equivalent of AppleScript `do shell script "echo " & quoted form of arg`:
console.log(app.doShellScript("echo " + quotedForm(arg)))

或者,如果您的 JXA 脚本碰巧加载了自定义 AppleScript 库BallpointBen建议执行以下操作(稍微编辑):

如果你有一个在 JS 中引用的 AppleScript 库var lib = Library("lib"),你可能希望添加

on quotedFormOf(s)
  return quoted form of s
end quotedFormOf 

到这个图书馆。
这将使引用形式的 AppleScript 实现随处可用,如lib.quotedFormOf(s)

于 2015-10-17T15:12:13.513 回答