Можно ли выполнять JSX-скрипты извне ExtendScript?
Обычно, когда вы пишете сценарий.jsx для автоматизации продукта Adobe (например, InDesign, Illustrator или Photoshop), вы пишете, отлаживаете и выполняете сценарий из IDE ExtendScript. Можно ли обойти ExtendScript и запустить скрипт из третьей программы?
Я думаю, что продукты Adobe имеют встроенный интерпретатор JavaScript, к которому ExtendScript может подключаться для доступа к объектным моделям Adobe и автоматизации их программного обеспечения. Я хотел бы иметь возможность подключиться напрямую к этому интерпретатору и запускать файлы jsx так же, как в ExtendScript.
7 ответов
Вы на Mac? Если это так, вы можете использовать AppleScript с osascript
инструмент для выполнения вашего JavaScript. Вот некоторые примеры:
Запуск JSX и возврат значения
Сохраните это как ~/temp/foo.scpt:
tell application "Adobe Illustrator"
-- 'do javascript' runs any arbitrary JS.
-- We're using the #include feature to run another
-- file. (That's an Adobe extension to JS.)
--
-- You have to pass a full, absolute path to #include.
--
-- The documentation alleges that 'do javascript'
-- can be passed an AppleScript file object, but
-- I wasn't able to get that to work.
do javascript "#include ~/temp/foo.jsx"
end tell
И сохраните это как ~/temp/foo.jsx:
var doc = app.activeDocument;
var numLayers = doc.layers.length;
// The last value in the JSX file will be printed out by
// osascript.
numLayers;
Теперь из командной строки запускаем osascript ~/temp/foo.scpt
Он напечатает количество слоев в активном документе Illustrator.
Получение данных из JavaScript является ограничением. Вы не можете печатать на стандартный вывод из JavaScript. Вместо этого поместите значение, которое вы хотите вернуть, как последний оператор файла JSX; это будет напечатано osascript
, (И вот почему: последнее значение в файле JSX - это возвращаемое значение do javascript
Заявление AppleScript. Это также последнее значение в файле AppleScript, и osascript
печатает окончательное значение.)
Значение, которое вы возвращаете из JavaScript, может быть числом, строкой, массивом или чем-то еще, что сохраняет свое значение при преобразовании в строку. Если вы хотите вернуть сложный объект, вам нужно #include библиотеку JSON и вызвать .toJSONString()
на объекте.
Передача аргументов в JSX
Чтобы передать аргументы в код JSX, следуйте этому примеру:
Файл ~/temp/args.scpt:
on run argv
tell application "Adobe Illustrator"
set js to "#include '~/temp/args.jsx';" & return
set js to js & "main(arguments);" & return
do javascript js with arguments argv
end tell
end run
Файл ~/temp/args.jsx
function main(argv) {
var layer = app.activeDocument.activeLayer;
app.defaultStroked = true;
app.defaultFilled = true;
// Top, left, width, height (in points).
// Note that parameters start at argv[0].
layer.pathItems.rectangle(argv[0], argv[1], argv[2], argv[3]);
}
А потом беги osascript args.scpt 50 30 10 80
отладка
do javascript
Команда также имеет опции для запуска отладчика ExtendScript. Для получения дополнительной информации откройте словарь Illustrator в редакторе AppleScript.
Для пользователей Windows вы можете использовать скрипт VBS. Передайте аргументы скрипту.jsx, предоставив аргументы cscript
команда вроде так: cscript test.vbs "hello"
, test.vbs может выглядеть так:
Dim appRef
Dim javaScriptFile
Dim argsArr()
Dim fsObj : Set fsObj = CreateObject("Scripting.FileSystemObject")
Dim jsxFile : Set jsxFile = fsObj.OpenTextFile("C:\Users\path\test.jsx", 1, False)
Dim fileContents : fileContents = jsxFile.ReadAll
jsxFile.Close
Set jsxFile = Nothing
Set fsObj = Nothing
javascriptFile = fileContents & "main(arguments);"
Set appRef = CreateObject("Illustrator.Application")
ReDim argsArr(Wscript.Arguments.length-1)
For i = 0 To Wscript.Arguments.length-1
argsArr(i) = Wscript.Arguments(i)
Next
Wscript.Echo appRef.DoJavaScript(javascriptFile, argsArr, 1)
Wscript.Echo
вернет последнюю строку, возвращенную файлом.jsx. Пример файла.jsx может быть:
function main(argv) {
alert(argv[0]);
return "test";
}
При запуске вы должны увидеть, что Illustrator (или любая другая программа Adobe) предупреждает "привет", а затем "test" будет возвращен на стандартный вывод (вы должны увидеть его в окне командной строки).
Это работает в Windows:
"C: \ Program Files (x86) \ Adobe \ Adobe Photoshop CS5 \ Photoshop.exe" C: \ completepathto \ my.jsx
Обратите внимание на путь к фотошопу. Он должен быть заключен в кавычки, поскольку содержит пробелы.
Есть много хитростей, чтобы выяснить, где загружен Photoshop. Вот тот, который находит все места, где загружен Photoshop, и помещает их в x.lst
@REM The Presets\Scripts doesn't really restrict where the loop is looking,
@REM thus the "IF EXIST" is needed. The FIND makes sure that the
@for /R "%ProgramFiles(x86)%\Adobe" %%f in (Presets\Scripts)
DO @IF EXIST %%f
(echo %%f | FIND /I "Adobe Photoshop C" >> x.lst )
Затем вы можете обработать каждую строку в x.lst. ПРИМЕЧАНИЕ: весь "@for" должен быть в ОДНОЙ строке, я разбил его на несколько строк для удобства чтения.
Если вы считаете, что будет только один Photoshop (а не Elements), вы можете изменить "echo %%f" на
"%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx
Прямой ответ - ДА. Illustrator, InDesign и Photoshop могут быть написаны через COM. Любая создаваемая вами программа, которая может получить доступ к COM (например, язык.net, C++, BCX, Autohotkey или Powerpro), может сказать Illustrator, InDesign или Photoshop сделать что-то.
Вот пример для Powerpro (вам понадобится плагин com для powerpro), и он работает в CS4 и CS5:
Function ComLoad() ;;MAKE SURE TO CALL .@ComUnload WHEN EXITING FUNCTION CALLS!
static objname="Illustrator.Application"
static com_status, com_type
static appRef=com.create_object(objname)
endfunction
Function ComUnload();;this is end the com calls and unload com
com.unload
endfunction
После использования функции ComLoad() вы запускаете любой метод или функцию, предлагаемые библиотекой COM. Вот как использовать Powerpro, чтобы указать Illustrator на запуск файла jsx или js:
;Run a script from anywhere
Function RunOtherScript(whatscript)
If (file.Validpath(whatscript) == 0)do
messagebox("ok","Whoops! That script doesn't exist!","ILL Runscript")
quit
endif
.@ComLoad()
appRef.DoJavaScriptFile(whatscript)
.@ComUnload()
quit
Вот изображение плавающей панели инструментов, которую я сделал с помощью Powerpro. Все кнопки привязаны к ком-функциям. Большую часть времени я использую функции com для запуска внешних jsx-скриптов.
[редактировать]
Есть другой способ! Вы можете использовать Adobe Configurator для создания новых панелей, которые могут запускать сценарии. Вы можете создать панель любым удобным для вас способом, и результаты будут практически аналогичны панели инструментов powerpro, которую я описал выше. Фактически я перешел с панели инструментов powerpro на панель Adobe Configurator.
Если вы разместите файлы.jsx в нужном месте
Photoshop
folder location:
/Applications/Adobe\ Photoshop\ CS5/Presets/Scripts
menu location:
File > Scripts
Illustrator
folder location:
/Applications/Adobe\ Illustrator\ CS5/Presets.localized/en_GB/Scripts
menu location:
File > Scripts
InDesign
folder location:
/Users/{user}/Library/Preferences/Adobe\ InDesign/Version\ 7.0/en_GB/Scripts/Scripts\ Panel
menu location:
Window > Utilities > Scripts
Это пути в OSX, в Windows должно быть легко найти эквивалент для Photoshop и Illustrator, но для InDesign может быть проще открыть панель сценариев и открыть папку сценариев с помощью контекстного меню панели.
Я знаю, что вы можете запускать сценарии.jsfl из командной строки, открывая Flash и передавая путь к сценарию.jsfl в качестве аргумента, но, похоже, это не работает для файлов.jsx с InDesign.
НТН
Это довольно старый вопрос. Я собираюсь ответить на этот вопрос, исходя из того, что:
- Вы запускаете сценарии JSX для пост- эффектов .
- Вы используете Windows.
Я не уверен, хотите ли вы передавать аргументы сценарию (в этом случае мое простое решение не сработает или может потребоваться неприятный обходной путь).
К счастью, есть простой способ сделать это с помощью постэффектов. Вы можете запустить cmd и ввести следующую команду:
afterfx -r C:/Users/me/myscript.jsx
Если afterfx не распознается, вам нужно добавить путь установки After Effects в Путь в ваших системных переменных. Мне неизвестно о наличии этой функции в других программах Adobe. Для получения дополнительной информации о запуске ваших сценариев After Effects из командной строки вы можете обратиться к: https://helpx.adobe.com/after-effects/using/scripts.html
Вы можете использовать сценарий расширения для его запуска. есть бесплатное расширение для Creative Cloud, которое поможет вам быстро запускать скрипты в , Photoshop и Pro, которые вы можете найти на Adobe Exchange ( Illustrator, а также после эффектовliveviewPremiere )