33

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

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

4

7 回答 7

37

你在 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 javascriptAppleScript 语句的返回值。这也是 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 词典。

于 2012-01-27T05:37:43.517 回答
15

对于 Windows 用户,您可以使用 vbs 脚本。通过向命令提供参数来将参数传递给 .jsx 脚本,如下所示cscriptcscript 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”将返回到标准输出(您应该在命令提示符窗口中看到它)。

于 2014-09-04T03:02:01.250 回答
6

这适用于 Windows:

"C:\Program Files (x86)\Adobe\Adobe 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 
于 2014-03-26T01:54:55.817 回答
4

直接的答案是YES。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 脚本。

在此处输入图像描述

[编辑]

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

于 2012-05-12T21:39:41.853 回答
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,打开脚本面板并使用面板的上下文菜单打开脚本文件夹可能更容易。

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

高温高压

于 2011-01-30T01:18:56.930 回答
0

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

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

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

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

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

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

于 2021-07-09T20:02:28.787 回答
-2

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

于 2021-02-03T04:47:38.337 回答