使用JavaScript调用Shell脚本以实现自动化

使用JavaScript调用Shell脚本以实现自动化,javascript,applescript,javascript-automation,Javascript,Applescript,Javascript Automation,使用AppleScript,我可以使用以下命令调用shell脚本: do shell script "echo 'Foo & Bar'" 但是我在约塞米蒂脚本编辑器中找不到一种用JavaScript实现这一点的方法。do shell Script是标准脚本添加的一部分,因此类似这样的东西应该可以工作: app = Application.currentApplication() app.includeStandardAdditions = true app.doShellScript(

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

do shell script "echo 'Foo & Bar'"

但是我在约塞米蒂脚本编辑器中找不到一种用JavaScript实现这一点的方法。

do shell Script
是标准脚本添加的一部分,因此类似这样的东西应该可以工作:

app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript("echo 'Foo & Bar'")
补充:

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

为此,AppleScript提供了的引号形式,以便在shell命令中安全地使用变量值作为参数,而不必担心shell更改值或完全破坏命令

奇怪的是,从OSX 10.11开始,似乎没有类似于
的引用形式的JXA,但是,很容易实现自己的(另一个答案和随后的更正):

//这是与AppleScript的`引用的`
函数quotedForm{return“'”+s.replace(/'/g,“\\'”)+“'}
据我所知,这正是AppleScript的
引用形式的
所做的

它用单引号将参数括起来,这样可以保护它不受shell扩展的影响;由于单引号shell字符串不支持转义嵌入的单引号,因此带有单引号的输入字符串被分解为多个单引号子字符串,其中嵌入的单引号通过
\'
拼接在一起,然后shell将其重新组合成单个文本

示例:

var-app=Application.currentApplication();app.includeStandardAdditions=真
函数quotedForm{return“'”+s.replace(/'/g,“\\'”)+“'}
//使用空格、单引号和其他shell元字符构造值
//(必须按字面意思引用的内容)。
var arg=“我是一个需要引用的值-|&;()”
//由于quotedForm(),这应该回显未修改的arg;
//它相当于AppleScript`do shell script“echo”&引用arg`:
console.log(app.doShellScript(“echo”+quotedForm(arg)))

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

如果您在JS中使用
var lib=library(“lib”)
引用了一个AppleScript库,您可能希望添加

quotedFormOf上的

报税表
结束引用格式
转到此库。
这将使引用表单的AppleScript实现随处可用,如
lib.quotedFormOf


也许这对您有所帮助:我建议您研究一下Cocoa的
NSTask
,因为它比
do shell script
更健壮、更强大。谢谢,@BallpointBen-我已经在答案的底部添加了您的建议,还有一些小的补充。