无法从 extendscript .jsx 文件调用可执行文件

Cannot call executable from extendscript .jsx file

我的目的是为 Adob​​e Illustrator 创建一个脚本,它调用我用一些输入参数编写的已编译 C 可执行文件。

C 可执行文件(名为 'crowd-generator')将生成并 return 一个基于输入参数的 x,y 坐标数组。

据我目前所做的研究表明,我应该能够执行这样的代码(暂时忽略输入参数):

#include crowd/crowd-generator

var script_file = new File('crowd/crowd-generator');
var result = script_file.execute();

然而,所有这一切似乎都是为了在 ExtendScript 中打开我的可执行文件,然后告诉我它有语法错误,但它绝对没有。我认为它可能正在尝试 运行 它作为 .jsx 文件。

我试过的一件事是给 'crowd-generator' 一个 .app 或 .exe 文件扩展名。这造成的唯一区别是,当尝试 运行 我的脚本时,我得到一个对话框,询问我可执行文件使用的是什么语言......然后无论我选择什么,它都会给我一个语法错误。

出了什么问题?有什么方法可以从 Adob​​e Illustrator 中的 .jsx 文件 运行 运行 此可执行文件?

这行是什么意思?:

  #include crowd/crowd-generator

事实上,您试图将可执行代码包含到 jsx 文件中,这就是错误。

不幸的是 Illustrator 没有像 InDesigns app.doScript 或 After Effects system.callSystem 这样的好功能。

在 macOS 上执行命令的一种方法是创建术语文件。

/* global $, app, File */
/**
 * Read about termfiles
 * http://docstore.mik.ua/orelly/unix3/mac/ch01_03.htm
 * 1.3.1.1. .term files
 */

var termfile = new File(File($.fileName).parent.fsName + '/command.term');
var command = 'cd ' + File($.fileName).parent.fsName + ' ; ls';
termfile.open('w');

termfile.writeln(
    '<?xml version="1.0" encoding="UTF-8"?>\n' +
        '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"' +
            '"http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n' +
            '<plist version="1.0">\n' +
                '<dict>\n' +
                    '<key>WindowSettings</key>\n' +
                '<array>\n' +
                ' <dict>\n' +
                '<key>CustomTitle</key>\n' +
                '<string>My first termfile</string>\n' +
                '<key>ExecutionString</key>\n' +
                '<string>' + command + '</string>\n' +
                '</dict>\n' +
                '</array>\n' +
                '</dict>\n' +
            '</plist>\n');

termfile.close();
termfile.execute();

另一种方法是创建命令文件。这只是一个 shell 脚本,您可以将其设为可执行文件 chmod +x myScript.command 然后您还可以使用执行命令调用它。

  • 创建文件 myScript.command,里面有一个简单的命令,ls 足以用于测试目的。

它应该是这样的:

#!/bin/bash
ls
  • 打开终端并导航到脚本所在的文件夹。
  • 使其可执行 运行 chmod +x myScript.command
  • 在旁边创建执行它的脚本。

内容应该是这样的:

var commandFile = File(File($.fileName).parent.fsName + '/myScript.command');
commandFile.execute();

从 Illustrator 执行。


一个问题是获取 return 值。

自从 post 提出这个问题以来,我取得了一些进展,并决定 post 我的答案。

我的代码有 2 个问题。

首先,正如 emax 在他们的回答中正确指出的那样,我错误地尝试将可执行文件包含在以下行中:

#include crowd/crowd-generator

删除此行后,代码仍然无法正常工作 - 我后来意识到这是因为 ExtendScript FILE 对象需要绝对文件路径而不是相对路径

source

所以 - 我更正后的代码看起来像这样:

var script_file = new File('/Applications/Adobe Illustrator CC 2015.3/Presets.localized/en_GB/Scripts/crowd/crowd-generator');
var result = script_file.execute();

现在我只需要弄清楚如何使用参数进行可执行调用,并返回结果。