osascript очень медленный, чем Script Editor - PullRequest
0 голосов
/ 02 ноября 2018

Прежде всего, я признаю, что начинаю с нового проекта с JXA (автоматизация Javascript для Mac OS) без особого понимания AppleScript.

В настоящее время я пытаюсь выполнить следующую команду, используя JXA :

Application("System Events").processes.windows.name()

Сначала я использовал Script Editor для его запуска. Он работал нормально, и я получил вывод достаточно быстро.

Однако, в соответствии с моим вариантом использования, так как я хочу часто получать вывод этого кода из одного из моих скриптов bash, я попытался выполнить его, используя osascript следующим образом

osascript -l JavaScript -e 'Application("System Events").processes.windows.name()' 

Но на этот раз потребовалось несколько секунд, чтобы распечатать результат в консоли.

Теперь мой вопрос: почему слишком много времени для выполнения одного и того же сценария в osascript по сравнению с редактором сценариев? Есть ли способ оптимизировать производительность?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вот решение JXA:

var winList = Application("System Events").processes.whose({backgroundOnly: {'=': false} }).windows.name();

var winList2 = winList.reduce(
  function(accumulator, currentValue) {
    return accumulator.concat(currentValue);
  },
  []
);
winList2 = winList2.filter(e => (e !== ""));
winList2.join(',')

Может быть лучший JavaScript от этих мастеров JavaScript.

0 голосов
/ 04 ноября 2018

Это не совсем ответ на ваш вопрос, но одна проблема, с которой сталкивается ваш JXA-скрипт, заключается в том, что он задействует ВСЕ процессы (которые могут быть огромными), когда вам, вероятно, нужны только те процессы, которые являются видимыми приложениями. Итак, начнем с этого.

Вот AppleScript, чтобы получить список всех непустых имен окон, в списке CSV на одной строке, всех видимых приложений:

tell application "System Events"
  set appList to (every application process whose background only is false)
  set winList2 to {}

  repeat with oApp in appList
    set winList to (name of every window in oApp whose name is not "")
    set winList2 to winList2 & (items of winList)
  end repeat

end tell

set AppleScript's text item delimiters to ","
set winListText to winList2 as text
return winListText

-->All Notes,Keyboard Maestro Editor,macos - osascript is very slower than Script Editor - Stack Overflow - Google Chrome - JMichael,Untitled 2.scpt,Untitled 2

Это не должно быть так сложно конвертировать в JXA, но если вы собираетесь просто запустить его как в сценарии оболочки, используя osascript, я не вижу никакого преимущества для конвертации в JXA.

Я не знаю природу вашего рабочего процесса, но если бы это был я, я бы запустил его как файл скомпилированного скрипта (.scpt) и выполнил ваш скрипт bash, используя AppleScript do script (или JXA * 1009). *) команда.

Было бы также быстрее, если бы вы использовали файл .scpt с командой osascript.

Я буду продолжать работать над этим сценарием и преобразовать его в JXA, для моей же выгоды, если не для вас.

Надеюсь, вы найдете это полезным. Если нет, может быть, кто-то еще.

Вопросы

...