2012-02-15 4 views
1

С несколькими установленными InDesign ScriptEditor пытается быть умным в отношении версии, которую должен выполнить сценарий. Тем не менее, я ищу DRY мой сценарий, так что мне нужно только изменить имя приложения один раз в моем скрипте.AppleScript, назначая приложение переменной

Существует аналогичный вопрос (Applescript path to application using variable), но это не работает для всего. Вопрос в том, почему это не работает для всего?

следующие работы, как и ожидалось:

tell application "Adobe InDesign CS5.5" 
    log name --"Adobe InDesign CS5.5.app" 
    log full name --"Mactastic:Applications:Adobe InDesign CS5.5:Adobe InDesign CS5.5.app:" 
end 

Немного действия сушильных:

set v to "Adobe InDesign CS5.5" 
set a to application v 
log name of a --"Adobe InDesign CS5.5" 
log full name of a 
--SYNTAX ERROR: Expected end of line, etc. but found property 
--"name" is highlighted in the ScriptEditor 

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

set f to (choose file) 
tell application "Adobe InDesign CS5.5" 
    open f without showing window 
end tell 

Однако, это не в состоянии как раньше:

set f to (choose file) 
set v to "Adobe InDesign CS5.5" 
set a to application v 
tell a 
    open f without showing window 
end 
--SYNTAX ERROR: Expected “given”, “with”, “without”, other parameter name, etc. but found class name. 
--"window" is highlighted in the ScriptEditor 

Моя среда:

  • OSX 10.6.8
  • ScriptEditor 2,3 (118)
  • Applescript 2.1.2

EDIT: Конец игры в том, что я был надеясь отвлечь часть функциональности InDesign до моих собственных классов, например:

InDesign.scpt - a класс, который абстрагирует функциональность InDesign

on new() 
    copy me to self 
    --do some initializing 
    return self 
end new 

on _version() 
    return "Adobe InDesign CS5.5" 
end _version 

on _application() 
    return application _version() 
end _application 

on _open(path) 
    tell _application() to open path without showing window 
end _open 

my_script.scpt - использует абстрактную InDesign.scpt выше

set InDesign to (load script file ("my:path:to:scripts:" & "Indesign.scpt"))'s new() 
InDesign's _open("my:path:to:indd:file.indd") 

Это хороший шанс, что выше не представляется возможным в AppleScript и ObjectiveC, где я должен смотри, как это сделать. Однако кажется, что некоторые вещи работают, как «скажите _application(), чтобы открыть путь», но «скажите _application(), чтобы открыть путь, не показывая окно».

+0

Это, по-видимому, является компиляционной проблемой для ссылок на объекты за пределами блока tell. Как ни странно, если свойство или команда более одного слова, оно не скомпилируется. Если свойство/команда является одним словом, компиляция и, следовательно, выполнение выполняется успешно. – spyle

+0

Использование 'run script' ([см. Этот пост] (http://www.mactipper.com/2008/10/run-applescript-in-applescript.html)) можно использовать, но код выглядит ужасно, и тогда трудно отлаживать. – spyle

ответ

1

Как насчет:

set theApplication to "Adobe InDesign CS5.5" 

using terms from application "Adobe InDesign CS5.5" 
    tell application theApplication 
     --do your thing here 
    end tell 
end using terms from 

В использовании терминов из используется, чтобы сценарий не компилировать иначе ничего в вашем theApplication блоке РАССКАЖИ будет компилировать что конкретные InDesign. Использование терминов довольно распространено, когда приложение (когда приложение является веб-сервисом или удаленной машиной) не существует или недоступно во время компиляции.

+0

Операция 'using terms from', похоже, не принимает переменные в качестве аргумента. Всякий раз, когда передается что-либо иное, чем буквальное «приложение» ApplicationName », он не компилируется, возвращая ошибку« Невозможно сделать некоторые данные в ожидаемом типе.« – fanaugen

+1

Как я уже сказал, использование терминов from должно быть использовано, если приложение не может скомпилировать, но должно быть в состоянии выполнить. Как будто вы говорите редактору сценариев« Не волнуйтесь, используйте определения сценариев из этого приложения, потому что во время выполнения все будет хорошо снова ». Итак, да, это нормально, что вы не можете использовать переменную при использовании терминов. –

Смежные вопросы