Синтаксическая ошибка с (старой?) Командой открытия папки

279
Isaac Rabinovitch

Я работаю над AppleScript 1-2-3 (2009) и не могу запустить этот пример:

tell application "Finder"  close every window open home set toolbar visible of the front Finder window to true set the sidebar width of the front Finder window to 135 set the current view of the front Finder window to column view set the bounds of the front Finder window to  set folder "Documents" of home set toolbar visible of the front Finder window to false set the current view of the front Finder window to flow view set the bounds of front Finder window to  select the last finder window end tell 

Парсер душит set folderкоманду, говоря: «Конец строки не может идти после этого свойства». Если я не облажался (вполне возможно), или книга просто не права, язык должен был измениться с 2009 года. Если так, то как?

Обновление: ответы и комментарии (стоит прочитать!) Убеждают меня, что книги просто не правы.

-2
Основная причина, по которой `set folder" Documents "строки кода home`, из вашего вопроса, выдает ошибки, заключается в том, что это не синтаксически правильно! Взгляните на [`set`] (https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216 -SW52) _command_ в руководстве по языку AppleScript для его синтаксиса и примеров! user3439894 6 лет назад 0
Я уверен, что вы правы, но сказать мне, чтобы посмотреть, и руководство по языку не помогает. Я изучал Applescript около 15 минут; Ссылка на справочник по языку в моем нынешнем состоянии невежества была бы как сбитый с толку студент ESL, изучающий Оксфордскую грамматику английского языка! Отстой, что книга «Apple Certified» содержит такую ​​основную ошибку. И на первых 39 страницах! Isaac Rabinovitch 6 лет назад 0
Ох, ФФС. Я могу принять, что некоторые люди могут подумать, что это плохой вопрос. Но понизить это, не объясняя, почему это просто по-детски. Isaac Rabinovitch 6 лет назад 0
В ответ на ваш комментарий «Говорить мне смотреть, а Руководство по языку не помогает», я думаю, что совет, на который @ user3439894 направил вас (смотрите и Руководство по языку), был «мертвым» уместным. Говоря только за себя (но я уверен, что другие с этим согласятся), изучение AppleScript было процессом именно этого .. Чтение языковых руководств и примеров, снова и снова и снова (даже если казалось, что я читал по-японски) wch1zpink 6 лет назад 1
Я думаю, что ваш комментарий не соответствует действительности. Я мог бы в конечном итоге последовать вашему совету (особенно если я столкнусь с более глупыми ошибками), но сейчас я пытаюсь прочитать * эту * книгу. Ваш совет сводится к тому, чтобы «выбросить эту глупую книгу и просто прочитать руководство по языку». Что может быть хорошим советом, но не помогает мне с поставленной задачей. Isaac Rabinovitch 6 лет назад 0

2 ответа на вопрос

1
CJK

Чтобы ответить на ваш конкретный вопрос о том, как AppleScript мог измениться с 2009 года, я не буду пытаться угадать множество способов, которыми он мог развиваться с тех пор (и я не мог найти языковую документацию с 2009 года или раньше), но я могу выделить текущая формулировка, поскольку это относится к вашему фрагменту кода. А именно, где ваш скрипт выдает ошибку, с синтаксической ошибкой в set folder "Documents" of home.

Способ определения setкоманды в (текущей версии) AppleScript:

[для] присвойте [ одно из] одно или несколько значений одной или нескольким переменным .

Он имеет следующий синтаксис:

установить переменнуюPattern в выражение

где variablePattern- имя переменной или списка переменных, и в ней expressionоцениваются значения, которые будут присвоены переменной (ам).

(Примечание. В Руководстве по языку AppleScript говорится, что вторая половина объявления, т. Е. to %expression%Является необязательной. Однако я не могу представить себе экземпляр, для которого это верно, и, насколько мне известно, всегдаset должен следовать полному синтаксису, как описано выше. Возможно, это один из способов, которым язык изменился ...?)

Таким образом, проще говоря, setвсегда используется, чтобы взять значение одной вещи и присвоить его другой, как и все остальные строки вашего фрагмента кода.

В следующей строке:

 set folder "Documents" of home 

у нас есть только половина объявления: команда начинается с предоставления объекта (в данном случае папки), который ищет новое значение, но затем не указывает, каким должно быть это новое значение.

Более того, folderобъект, как правило, сам по себе не может быть назначен значения. Никто не может командовать:

 set folder "Documents" of home to desktop 

Однако можно присвоить folderобъект чему-то другому, например, переменной или значению существующего свойства, например targetсвойству a Finder window:

 set the target of the front Finder window to folder "Documents" of home 

Команда setинструктирует AppleScript использовать значение выражения folder "Document" of home(которое оценивает ссылку на местоположение на жестком диске) и назначать его targetсвойству front Finder window(которое определяет, какой каталог отображается в окне). Как и следовало ожидать, это приводит к переключению каталога активного окна Finder из домашнего каталога в каталог документов .

Это кажется маловероятным желаемому результату, как применение всех этих действий в одном Finder окна означает, что предыдущие строки несколько излишни: не было бы никакой необходимости, чтобы открыть Дом папку и установить его свойства ( toolbar visible, sidebar width, current viewи bounds), только тогда изменить каталог и установить все эти свойства на новые значения.

Поэтому я думаю, что наиболее вероятное решение - это то, на что намекнул @ wch1zpink в своем ответе, а именно: открыть новое окно Finder в месте расположения папки « Документы ».

Я решил сделать это точно так же, как это делал скрипт с домашней папкой:

 open folder "Documents" of home 

которая полностью заменяет проблемную линию. Таким образом, полученный скрипт имеет приятную симметрию в том, как создаются и управляются два окна:

 tell application "Finder" activate close every window  open home set toolbar visible of the front Finder window to true set the sidebar width of the front Finder window to 135 set the current view of the front Finder window to column view set the bounds of the front Finder window to   open folder "Documents" of home set toolbar visible of the front Finder window to false set the current view of the front Finder window to flow view set the bounds of front Finder window to   select the last Finder window end tell 

openКоманда, очевидно, открывает новый Finder окно в указанном месте, но и делает, что новый Finder Окно передней Finder окна .

Из этого легче увидеть, что первый блок setоператоров предназначен для одного окна Finder ; и второй блок для другого.

Надеюсь, я обратился к вашему запросу напрямую и предоставил объяснение, которое имеет смысл. Простите, если что-то из того, что я написал, звучит покровительственно: я старался избегать предположений о том, что вы делаете и не знаете об AppleScript, несмотря на доказательства того, что вы явно не новичок (репутация 2.5K в Super User). С другой стороны, если что-то из того, что я написал, является двусмысленным или плохо объясненным, дайте мне знать, и я с радостью уточнить или переформулировать в случае необходимости.

Что касается вашего «Примечание: AppleScript Language Guide гласит ...», я предполагаю, что в контексте _expression_ является необязательным в том смысле, что он также может быть установлен в «», что Apple может не рассматривать как выражение, так как «» » `буквально ничего, но он инициализирует _variable_, который имеет свои применения. Это либо что-то в этом роде, либо плохая документация, к которой может обратиться только Apple, если она последняя. user3439894 6 лет назад 1
Спасибо, что точно отвечаю на мой вопрос. (Возможно, более подробно, чем мне нужно, но в этом нет никакого вреда.) Вы заставляете меня подозревать, что это не изменение языка, а простая ошибка плюс неспособность проверить пример, выполнив его на самом деле. В некотором роде я задаюсь вопросом, насколько хорошо QA'd книга. Isaac Rabinovitch 6 лет назад 0
-1
wch1zpink

Если ваше намерение с этой строкой кода ... set folder "Documents" of homeзаключается в том, чтобы текущее окно поиска отображало папку «Документы», то просто замените эту строку set folder "Documents" of homeэтой ...

set theFolder to folder "Documents" of home open theFolder 
Мое намерение такое, как указано: выяснить, почему я получаю синтаксическую ошибку. Isaac Rabinovitch 6 лет назад 0

Похожие вопросы