Как записать в стандартные данные, используя JavaScript или AppleScript несколько раз?

Если я создам сценарий AppleScript с именем myscript.js и передам его в oascript, он выполнит функцию run один раз и напишет "hello world" для стандартных данных:

function run(args) {

  for (var i=0;i<10;i++) {
     // out("number " + i); // execution error: Error on line 18: ReferenceError: Can't find variable: out (-2700)
  }

  return "hello world"; // written to standard data out
}

Но если я хочу записывать в стандартные данные несколько раз, например, в цикле for, как мне это сделать?

Если я делаю следующее, он записывает в стандартную ошибку несколько раз и отправляет несколько событий во внешнем приложении:

  for (var i=0;i<10;i++) {
     console.log("number " + i);
  }

Единственная проблема заключается в том, что он создает события ошибок, а не стандартные события данных.

В редакторе скриптов стандартные данные выводятся в окно результатов. Я хочу распечатать в окне результатов несколько раз. Из Mac OSX Script Editor

ОБНОВИТЬ:
Похоже, это может быть невозможно. Я нашел эту цитату здесь:

Q: Мой скрипт будет производить вывод в течение длительного времени. Как я могу прочитать результаты по мере их поступления?

A: Опять же, краткий ответ: вы не делаете - сценарий оболочки не будет возвращаться, пока команда не будет выполнена. В терминах Unix его нельзя использовать для создания канала. Однако вы можете поместить команду в фоновый режим (см. Следующий вопрос), отправить ее выходные данные в файл, а затем прочитать файл по мере его заполнения.

Кроме того, обратите внимание, если я хочу использовать JavaScript вместо AppleScript, должен ли я использовать Cocoascript вместо Osascript?

2 ответа

"Кроме того, я должен использовать кокоаскрипт вместо osascript?"

TL;DR: Если вы любите JavaScript, ни того, ни другого. Go Node!


Длинная версия:

JXA (JavaScript для автоматизации) содержит ошибки и неполные выпечки, практически без пользовательской документации, инструментов, библиотек или сообщества. Команда Apple, ответственная за его поставку, была официально расформирована и переназначена / уволена в 2016 году, а вся платформа MacOS Automation застряла в режиме обслуживания (и уже находится под угрозой!) С 10.13. После четверти века упорного пренебрежения, плохого управления, и screwups, он не принимает экспертом, чтобы догадаться, где наследство от Apple, Mac-только технологии автоматизации возглавляются в настоящее время.

CocoaScript работает... и это все. Это стороннее программное обеспечение с открытым исходным кодом, так что, по крайней мере, оно не зависит от Apple в его дальнейшей разработке и поддержке, но никогда не создавало достаточно большое и энергичное пользовательское сообщество, чтобы сделать его популярным. И быстрый взгляд на проекты CocoaScript/Mocha на GitHub также указывает на отсутствие текущих разработок, кроме необходимого обслуживания.

Это не значит, что вы не можете использовать их [... на данный момент], но если у вас нет неизбежной веской причины для этого, есть только одна платформа JS, которая имеет значение сейчас: Node.js.

В отличие от вышеизложенного, Node обладает огромными глобальными инвестициями, разработками, инструментами, документацией, сообществом и ростом рынка. (3,5 миллиона пользователей в 2016 году и растет!) Полностью с открытым исходным кодом и независимым. Работает практически на любой платформе ОС, которая также имеет значение: Windows, Mac, Linux; даже Android. NPM также является феноменальным ресурсом: легко с PyPI, RubyGems и другими. (Даже есть библиотеки macOS для событий Какао и Apple, хотя для обоих может потребоваться некоторый TLC прямо сейчас из-за всей нестабильности и неуверенности в все более хаотичной платформе Apple.) О, и огромные возможности работы и возможности проекта FOSS, если вы когда-нибудь захотите стать профессионалом тоже.

НТН


ps Чтобы ответить на ваш оригинальный вопрос, используйте -[NSFileHandle fileHandleWithStandardOutput] чтобы получить канал к stdout и вызвать его -writeData: метод столько раз, сколько хотите, передавая (например) NSData экземпляр создан с помощью [[NSString stringWithString: aMessage] dataUsingEncoding: NSUTF8StringEncoding] как аргумент. Или, вы знаете, просто игнорируйте все это и Узел это!;)

/ relurk

Сценарий - это выражение, которое оценивает окончательное значение, возвращаемое вызывающей стороне из JSContext.

Если вы хотите, чтобы это значение состояло из повторяющихся или нескольких строк, то это значение, которое ваш скрипт должен определить и вернуть.

(() => {

    // enumFromToInt :: Int -> Int -> [Int]
    const enumFromToInt = (m, n) =>
        n >= m ? Array.from({
            length: Math.floor(n - m) + 1
        }, (_, i) => m + i) : [];

    // unlines :: [String] -> String
    const unlines = xs => xs.join('\n');

    return unlines(
        enumFromToInt(1, 25)
        .map(n => n.toString() + " hello")
    );
})()
Другие вопросы по тегам