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

Используя AppleScript, я могу вызвать скрипт оболочки с:

do shell script "echo 'Foo & Bar'"

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

2 ответа

Решение

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

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

В дополнение к полезному ответу 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)

Другие вопросы по тегам