【问题标题】:Is it possible to execute JSX scripts from outside ExtendScript?是否可以从 ExtendScript 外部执行 JSX 脚本?
【发布时间】:2010-10-02 16:43:44
【问题描述】:

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

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

【问题讨论】:

    标签: javascript adobe extendscript indesign-server


    【解决方案1】:

    您使用的是 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 调试器的选项。有关详细信息,请在 AppleScript Editor 中打开 Illustrator 字典。

    【讨论】:

    • Windows 怎么样?有什么想法吗?
    • 这是运行文件目录的方式:在运行时 argv 告诉应用程序“Adobe Illustrator”将 f 设置为 POSIX 文件“#{file}”作为别名 do javascript f 使用参数 argv end tell end run
    • @David 查看我对 windows 的回答
    • 你知道AppleScript中的结果值是否可以以任何方式重用吗?我希望 AppleScript 根据 JavaScript 返回的值做出不同的反应。谢谢。
    • Aleksander:你能发布一个新问题,更详细地说明你想做什么
    【解决方案2】:

    对于 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”将返回到标准输出(您应该在命令提示符窗口中看到它)。

    【讨论】:

    • 仅供参考,对于那些喜欢坚持使用所有 javascript 的人来说,这里的解决方案可以重写为 Microsoft JScript。然后它将是一个 javascript 版本(可以执行 ActiveX/COM 调用)来执行实际的 JSX javascript 代码。
    • 如果您安装了多个版本的 Adob​​e 应用程序,请使用 Illustrator.Application.xx,其中 xx 是版本号(十进制)以获得您想要的版本。
    • 如果您运行的是 Windows x64 并且希望 Photoshop 的 32 位版本例如制作一个包含以下内容的批处理文件来运行您的示例脚本:START C:\Windows\SysWOW64\ cmd.exe /K "cscript test.vbs 你好"
    • 按广告宣传!
    【解决方案3】:

    这适用于 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),那么您可以更改 “回声 %%f”

    "%%f\..\..\Photoshop.exe" C:\completepathto\my.jsx 
    

    【讨论】:

    • 您也可以通过这种方式将脚本参数传递给 JSX 文件,作为脚本路径后的附加参数给 Photoshop 吗?
    • 我想知道类似的方法是否适用于 Mac,例如:/pathOnMacTo/Photoshop /completePathTo/my.jsx
    • @David:回复晚了,但是是的,同样的方法适用于 OSX。
    【解决方案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 脚本。

    [编辑]

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

    【讨论】:

    • 但是当 COM 被实例化时,这是否会启动 Adob​​e 应用程序,就像手动打开应用程序并通过脚本菜单执行脚本但以编程方式执行它一样?或者,如果应用程序 GUI 不会在桌面上启动,这种技术是否会在无 GUI 的情况下工作?我注意到,对于 MS Office(至少是早期版本),当 COM 被调用并且 GUI 关闭时,它会像 Word 一样打开应用程序,所以你会短暂地看到它打开以执行处理然后关闭。在可能的情况下,我更喜欢完全无 GUI 的选项。
    • 好吧,您必须编写代码来决定如果在之前未启动 adobe 应用程序的情况下调用 COM 函数时该怎么做,并且您需要在开始 COM 调用之前执行此操作.但是,您不能在没有打开应用程序 GUI 的情况下向 Adob​​e 应用程序调用 COM 函数。在某些情况下,MS Office 是一个不同的故事。但是,如果 Adob​​e 应用程序是打开的,您可以对其进行无 GUI 的 COM 调用,例如,从另一个自定义应用程序;但同样,必须打开 Adob​​e 应用程序的 GUI。我想你也许可以“隐藏”应用程序窗口或其他东西......
    • 在我上面说明的情况下,使用我的工具栏,因为工具栏仅在 Adob​​e 应用程序打开时出现(感谢 powerpro!),我不必担心确保 Adob​​e GUI 已打开在我运行 COM 脚本之前。
    • AutoIt 显然也支持 COM。我用过 AutoIt;它很棒,但我从来没有使用过 COM 的东西。可能值得一看。
    【解决方案5】:

    如果您将 .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 文件。

    HTH

    【讨论】:

    • 有趣。谢谢你,乔治。
    • 不幸的是,每次新安装或更新 Adob​​e 产品时,“正确位置”都会发生变化。例如,这些 cmets 非常古老,因为 CS5 现在“很久以前”了。
    • CC 路径类似:/Adobe Illustrator CC/en_US/Scripts
    【解决方案6】:

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

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

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

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

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

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

    【讨论】:

      【解决方案7】:

      您可以使用扩展脚本来运行它。 Creative Cloud 上有一个免费的扩展,可以帮助您在 Illustrator、After Effects、Photoshop 和 Premiere Pro 中快速运行脚本 你可以在 adobe exchange (liveview) 上找到它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2022-11-17
        • 2021-05-22
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多