是否可以从ExtendScript外部执行JSX脚本?

时间:2010-10-02 16:43:44

标签: javascript adobe extendscript jsx indesign-server

通常,当您编写.jsx脚本以自动化Adobe产品(如InDesign,Illustrator或Photoshop)时,您可以从ExtendScript IDE编写,调试和执行脚本。是否可以绕过ExtendScript并从第三个程序运行脚本?

我认为Adobe产品具有内置的JavaScript解释器,ExtendScript可以连接到该解释器以访问Adobe对象模型并自动化其软件。我希望能够像在ExtendScript中一样直接连接到该解释器并运行jsx文件。

7 个答案:

答案 0 :(得分:35)

你在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中打印到stdout。而是将要返回的值作为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调试器的选项。有关详细信息,请在AppleScript编辑器中打开Illustrator词典。

答案 1 :(得分:13)

对于Windows用户,您可以使用vbs脚本。通过为cscript命令提供参数,将参数传递给.jsx脚本,如: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程序)警告“hello”,然后“test”将返回到stdout(你应该在命令提示符窗口中看到它)。

答案 2 :(得分:5)

这适用于windows:

  

“C:\ Program Files(x86)\ Adob​​e \ Adob​​e Photoshop CS5 \ Photoshop.exe”C:\ completepathto \ my.jsx

注意Photoshop的路径。它必须引用,因为它包含空格。

有很多技巧可以确定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 

答案 3 :(得分:4)

直接答案是。 Illustrator,InDesign和Photoshop都可以通过COM编写脚本。您制作的任何可以访问COM的程序(例如.net语言,C ++,BCX,Autohotkey或Powerpro)都可以告诉Illustrator,InDesign或Photoshop。

以下是Powerpro的示例(您需要powerpro的com插件),这适用于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功能。大多数时候我使用com函数来运行外部jsx脚本。

enter image description here

<强> [编辑]

还有另一种方式!您可以使用Adobe Configurator创建能够启动脚本的新面板。您可以以任何您喜欢的方式设计面板,结果与我上面描述的powerpro工具栏非常相似。实际上,我从powerpro工具栏移到了Adobe Configurator Panel。

答案 4 :(得分:3)

如果将.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,可能更容易打开Scripts Panel并使用Panel的上下文菜单打开脚本文件夹。

我知道您可以通过打开Flash并将路径作为参数传递给.jsfl脚本,从命令行运行.jsfl脚本,但这对于使用InDesign的.jsx文件似乎不起作用。

HTH

答案 5 :(得分:0)

这个问题很老了。我将在以下假设下回答这个问题:

  1. 您正在为 after effects 运行 JSX 脚本。
  2. 您使用的是 Windows

我不确定您是否想将参数传递给脚本(在这种情况下,我的简单解决方案将不起作用,或者可能需要令人讨厌的解决方法)。

幸运的是,有一种简单的方法可以通过后效来做到这一点。您可以启动 cmd 并键入以下命令:

afterfx -r C:/Users/me/myscript.jsx

如果 afterfx 未被识别,您需要将 After Effects 安装路径添加到系统变量中的 Path。我不知道此功能在其他 Adob​​e 程序中的可用性。 有关从命令行运行 After Effects 脚本的更多信息,您可以参考:https://helpx.adobe.com/after-effects/using/scripts.html

答案 6 :(得分:-1)

您可以使用扩展脚本来运行它。 创意云上有一个免费的扩展程序将帮助您在 illustrator、aftereffects、photoshop 和 Premiere pro 中快速运行脚本 你可以在 adobe exchange ( liveview )

上找到它