无法从 extendscript .jsx 文件调用可执行文件
Cannot call executable from extendscript .jsx file
我的目的是为 Adobe 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 文件扩展名。这造成的唯一区别是,当尝试 运行 我的脚本时,我得到一个对话框,询问我可执行文件使用的是什么语言......然后无论我选择什么,它都会给我一个语法错误。
出了什么问题?有什么方法可以从 Adobe 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 对象需要绝对文件路径而不是相对路径
所以 - 我更正后的代码看起来像这样:
var script_file = new File('/Applications/Adobe Illustrator CC 2015.3/Presets.localized/en_GB/Scripts/crowd/crowd-generator');
var result = script_file.execute();
现在我只需要弄清楚如何使用参数进行可执行调用,并返回结果。
我的目的是为 Adobe 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 文件扩展名。这造成的唯一区别是,当尝试 运行 我的脚本时,我得到一个对话框,询问我可执行文件使用的是什么语言......然后无论我选择什么,它都会给我一个语法错误。
出了什么问题?有什么方法可以从 Adobe 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 对象需要绝对文件路径而不是相对路径
所以 - 我更正后的代码看起来像这样:
var script_file = new File('/Applications/Adobe Illustrator CC 2015.3/Presets.localized/en_GB/Scripts/crowd/crowd-generator');
var result = script_file.execute();
现在我只需要弄清楚如何使用参数进行可执行调用,并返回结果。