Вызов сценария оболочки с помощью JavaScript для автоматизации

Используя AppleScript, я могу вызвать сценарий оболочки с помощью:

do shell script "echo 'Foo & Bar'"

Но я не могу найти способ сделать это с помощью JavaScript в редакторе сценариев Yosemite.


person sverrejoh    schedule 20.01.2015    source источник
comment
Возможно, это поможет вам: stackoverflow.com/ вопросы/27586694/   -  person ShooTerKo    schedule 20.01.2015
comment
Я бы порекомендовал изучить Cocoa NSTask, так как он намного надежнее и эффективнее, чем do shell script.   -  person foo    schedule 21.01.2015


Ответы (2)


do shell script является частью стандартных дополнений к сценариям, поэтому должно работать что-то вроде этого:

app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript("echo 'Foo & Bar'")
person ShooTerKo    schedule 20.01.2015

Чтобы дополнить полезный ответ ShooTerKo:

При вызове оболочки важно правильно заключать в кавычки аргументы, встроенные в команду:

С этой целью AppleScript предоставляет quoted form of для безопасного использования значений переменных в качестве аргументов в команде оболочки, не опасаясь изменения значений оболочкой или полного нарушения команды.

Любопытно, что в 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, "'\\''") + "'" }

Насколько я могу судить, это делает именно то, что делает AppleScript quoted form of.

Аргумент заключен в одинарные кавычки, что защищает его от расширения оболочки; поскольку строки оболочки в одинарных кавычках не поддерживают экранирование встроенных одинарных кавычек, входная строка с одинарными кавычками разбивается на несколько подстрок в одинарных кавычках, а встроенные одинарные кавычки соединяются через \' , который оболочка затем собирает в один литерал.

Пример:

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 предлагает выполнить далее (слегка отредактировано):

Если у вас есть библиотека AppleScript, на которую вы ссылаетесь в JS, используя var lib = Library("lib"), вы можете добавить

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

в эту библиотеку.
Это сделает реализацию AppleScript в кавычках доступной везде, как lib.quotedFormOf(s)

person mklement0    schedule 17.10.2015
comment
Спасибо, @BallpointBen - я добавил ваше предложение в конец ответа с некоторыми незначительными дополнениями. - person mklement0; 01.10.2018