Как закрыть все окна Finder с помощью JXA

Я в основном хочу перенести этот код из AS в JXA:

tell application "Finder"
    close every window
    open folder "Projects" of folder "Documents" of home
    tell the front Finder window
        set the bounds to {0, 0, 1920, 1080}
        set the current view to list view
    end tell
end tell

Заранее спасибо! Информации о JXA так мало!


person Reydel Leon    schedule 09.02.2016    source источник
comment
См. мой список: Ресурсы JXA   -  person JMichaelTX    schedule 10.02.2016


Ответы (3)


Эта однострочник закроет все окна Finder:

with (Application('Finder')) close(windows)

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

f = Application('Finder')
w = f.windows.first

f.close(f.windows)
f.open(f.home.folders["Documents"].folders["Projects"])
w.bounds = {"x":0, "y":0, "width":1920, "height":1000}
w.currentView = 'list view'
person bacongravy    schedule 12.02.2016
comment
О, парень! Я бы не понял этого с доступной документацией! Спасибо! - person Reydel Leon; 12.02.2016

Чтобы закрыть все окна Finder, скрипту нужен цикл:

finder.finderWindows().forEach(function(w) {w.close()})

or

var allWindows = finder.finderWindows()
for (var i in allWindows) {allWindows[i].close()}

или с помощью метода map:

var finder = Application('Finder')
finder.finderWindows().map(function(w){w.close()})
finder.home.folders["Documents"].folders["Projects"].open()
finder.finderWindows[0].bounds = {"x":0, "y":0, "width":1920, "height":1000}
finder.finderWindows[0].currentView = 'list view'
person jackjr300    schedule 09.02.2016
comment
Спасибо за предоставление альтернативных методов для этого. - person JMichaelTX; 10.02.2016

Следующее должно работать:

Application('Finder').windows.close()

Увы, JXA состоит из Lame and Fail †, поэтому просто выдает ошибку при запуске, поэтому вам придется использовать цикл, чтобы закрыть каждое окно по одному.

Однако вам нужно быть осторожным при переборе массива спецификаторов объектов, поскольку только спецификаторы по идентификатору гарантированно будут стабильными. (Помните: спецификаторы объектов являются первоклассными запросами, а не указателями, поэтому ведут себя совсем иначе, чем ссылки в стиле OO.) В этом случае finder.finderWindows().forEach(function(w) {w.close()}) jackjr выполнит эту работу, потому что finder.finderWindows() возвращает массив спецификаторов по идентификатору. Однако, если массив содержит спецификаторы по индексу, вы должны повторять эти спецификаторы от последнего к первому, иначе вы получите ошибки с отклонением от N.

† (TBH, для любой нетривиальной работы по автоматизации вам лучше всего придерживаться AppleScript. Сам язык может быть дерьмовым, но это единственный поддерживаемый в настоящее время вариант, который действительно правильно описывает события Apple.)

person foo    schedule 10.02.2016
comment
Да, я пробовал это, прежде чем задать этот вопрос здесь. Мне казалось, что это самый логичный путь, но он не сработал. Попробовав все возможные способы, которые я мог придумать, я сдался и пришел сюда. Я не хотел идти по круговому маршруту, так как мне казалось, что должен быть лучший путь. - person Reydel Leon; 12.02.2016
comment
Я могу подтвердить, что версия bacongravy работает. app.specifier.command() — это просто удобный синоним для app.command(specifier), но, как и многие вещи в JXA, он работает только до некоторой случайной точки, после чего он волшебным образом ломается, и вы не понимаете почему. Тупо разочаровывающий и идиотски сломанный, с бесполезной пользовательской документацией и нулевой официальной поддержкой. Честно говоря, я не шучу, когда говорю, что вам лучше придерживаться AS, если можете: язык может быть мусорным, но, по крайней мере, у него есть сложившееся сообщество пользователей, которые его понимают и всегда рады помочь. - person foo; 12.02.2016
comment
p.s. Другая серьезная причина, по которой вы не можете получить информацию о JXA, заключается в том, что я отказался от всех своих планов написать книгу по автоматизации JXA из-за того, что она была сильно перегружена. Я уже написал одну книгу по AppleScript, которая почти довел нас до нервного срыва, а JXA облажался еще больше, чем AS. И я чуть ли не единственный человек, который на самом деле понимает все это достаточно хорошо, чтобы правильно объяснить (еще более удручающая мысль!), так что не задерживайте дыхание. Такая упущенная возможность. :( - person foo; 12.02.2016
comment
В этом случае поведение не является ни случайным, ни магическим; JXA просто не поддерживает вызов команд на массивы элементов. Вместо этого JXA использует доступ к свойствам массивов элементов в качестве сокращения для поиска имени и индекса. В JavaScript windows.close и windows["close"] означают одно и то же, поэтому, когда вы пытаетесь вызвать close() для массива элементов windows, JXA пытается получить окно с именем close, как описано в документации. - person bacongravy; 20.02.2016
comment
JXA использует доступ к свойствам в массивах элементов как сокращение для имени … поиска -- на самом деле он использует его для создания спецификаторов свойств/элементов и селекторов по имени. Что само по себе создает умопомрачительно глупый конфликт. например Является ли textedit.documents.text, он же textedit.documents["text"], ссылкой на текст всех документов или на документ с именем text? И почему вы можете сказать documents.text(), но не documents.close()? JXA изобилует такой непроницаемой глупостью. (И да, я потратил недели своего времени, отмечая все эти проблемы, когда было объявлено о JXA.) - person foo; 21.02.2016
comment
Кстати, массивов элементов не существует. Документация JXA является мусором. Объектная модель событий Apple представляет собой реляционный граф, не объектно-ориентированное дерево, подобное DOM. Каждый узел в графе AEOM имеет свои собственные атрибуты (слоты, которые содержат простые значения, такие как строки и числа, описывающие состояние этого узла), и может иметь любое количество один к одному и/или отношения «один ко многим» с другими узлами. Вот несколько приблизительный обзор, а вот статья, написанная первоначальным дизайнером. - person foo; 21.02.2016