Могу ли я поместить общий код appleScript в отдельный файл и загрузить его в различные сценарии? - PullRequest
1 голос
/ 15 февраля 2010

Я начинаю ковыряться с Applescript и смотрю на написание нескольких скриптов для управления окнами. Общая задача, которая им всем нужна, - получить текущий размер экрана.

Я создал подпрограмму screen_size, которая, кажется, работает, и я хочу иметь возможность поделиться этим со всеми моими сценариями. Тем не менее, я не могу найти способ поместить это в отдельный файл, который я могу загрузить в другие мои скрипты. Я попытался создать отдельный файл screen_size.scpt и использовать load script "screen_size.scpt", но я получаю сообщение об ошибке "не могу сделать" screen_size.scpt "в файл типа".

Должен быть способ сделать это, но я не смог найти в Интернете ничего о том, как это сделать.

EDIT:

Предлагаемый материал POSIX не работает для меня. Я могу создать объект файла, но он отказывается преобразовывать в псевдоним, говоря, что он не может найти файл (похоже, что файл POSIX остается относительным, а не раскрывается полностью).

В Интернете я нашел предложение использовать Finder и получил следующий псевдоним:

tell application "Finder"
  set _myPath to container of (path to me) as text
end tell

set _loadPath to (_myPath & "screen_size.scpt")
set _loadAlias to alias _loadPath

Однако следующая строка завершается с ошибкой синтаксиса, утверждая, что _loadAlias ​​не является переменной:

property _ScreenSize : load script _loadAlias

Все варианты, которые я пробовал (создание псевдонима в вызове загрузки и т. Д.), Терпят неудачу, всегда утверждая, что переменная не существует, даже если я знаю, что она установлена ​​и работает, поскольку я могу ее отобразить. В чем дело? Почему он утверждает, что переменная не существует, когда она, очевидно, существует?

Ответы [ 6 ]

2 голосов
/ 15 февраля 2010

AppleScript делает некоторые действительно странные вещи при сохранении, и я не понял, что происходит, но в итоге я заставил что-то работать.

Вот что у меня есть:

on load_script(_scriptName)
  tell application "Finder"
    set _myPath to container of (path to me) as text
  end tell

  set _loadPath to (_myPath & _scriptName)
  load script (alias _loadPath)
end load_script

set _ScreenSize to load_script("screen_size.scpt")

set _bounds to _ScreenSize's screen_size()
-- ...

В других ответах говорилось установить _ScreenSize как свойство, но это вызвало бы синтаксическую ошибку, из-за которой я не смог сохранить файл. Когда я сделал это просто с помощью set, это сработало.

Мне никогда не удавалось заставить работать с POSIX, но поиск Finder для пути работал нормально.

1 голос
/ 26 апреля 2013

У меня есть люди, использующие мои библиотеки ежедневно, поэтому я сначала проверяю библиотеку, прежде чем вызывать ее.Допустим, у меня есть библиотека "Lib.Excel.app" (сохранить как нередактируемое приложение с Satimage's Smile).В начале скрипта, который его использует, я «загружаю» библиотеку, используя следующий код:

set commonCodeFile to (path to library folder as string) & "Scripts:CommonLibraries:Lib.Excel.app"

tell application "Finder"
    if not (exists (file commonCodeFile)) then error ("\"Lib.Excel\"
" & "
should be found in folder
" & "
scroll > CommonLibraries")
end tell

global cc -- make it short and easy to write :)
set cc to load script alias ccFile

Затем, когда мне нужно использовать функцию из библиотеки, я просто вызываю ее так:

set {what, a} to cc's veryNiceFunction()
1 голос
/ 22 апреля 2013

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

В вашем случае этот скрипт будет "screen_size.scpt". Поэтому «screen_size.scpt» должен выглядеть примерно так:

on screen_size()
       --your actions
return [yourvalue] --the value you want to pass to the other script
end screen_size()

Скрипт, из которого вы его загрузите, должен выглядеть так:

tell application "Finder"
    set _myPath to (container of (path to me) as text & "screen_size.scpt") as alias
end tell
set _ScreenSizeScript to load script _myPath

set _bounds to _ScreenSizeScript's screen_size()

Если это не работает или вы не понимаете меня полностью, не стесняйтесь спрашивать (:

1 голос
/ 15 февраля 2010

Да, есть способ сделать это. Загрузите файл в свойство и получите к нему доступ таким образом

property _ScreenSize : load script (alias "pathtoscript")

_ScreenSize's doStuff()

и для относительных путей попробуйте это:

set p to "./screen_size.scpt" 
set a to POSIX file p 

так что, возможно, это будет работать:

set p to "./screen_size.scpt" 
set a to POSIX file p 

property _ScreenSize : load script (alias a)

_ScreenSize's doStuff()
0 голосов
/ 13 июня 2013

Вы МОЖЕТЕ загрузить скрипт в переменную, но вы должны сначала объявить его.

property _ScreenSize : missing value

tell application "Finder" to set _myPath to container of (path to me) as text

set _loadPath to (_myPath & "screen_size.scpt")

set _loadAlias to alias _loadPath

set _ScreenSize to (load script _loadAlias)
0 голосов
/ 15 февраля 2010

Да, вы можете. Однако вам нужен полный путь к сценарию.

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

Я использовал эту технику, чтобы обойти AppleScripts (прежний) 32-килограммовый лимит размера текста несколько лет назад для некоторых действительно больших / сложных сценариев IRC.

Я думаю, что у меня все еще есть те старые скрипты в моем G4, который находится под столом в моем офисе на работе. К сожалению, он находится за коммутатором Enet, и я не могу подключиться к нему через VNC, в противном случае у меня будет тонны примера кода для публикации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...