app.doScript和$.evalFile有什么区别?

10
到目前为止,我发现唯一的区别是:如果由app.doScript运行的脚本返回错误,则错误的文件和行号将被app.doScript调用的文件和行号覆盖。还有其他区别吗?
下面是演示上述区别的示例代码:
首先运行InDesign:
c:
cd "C:\Program Files\Adobe\Adobe InDesign CS6 Server x64"
InDesignServer.com -port 12345
pause

下一步创建一个批处理文件来运行脚本:
c:
cd "C:\Program Files\Adobe\Adobe InDesign CS6 Server x64"
sampleclient -host localhost:12345 -server "C:/doscript_vs_evalfile/call_doScript.jsx"
pause

这是“call_doScript.jsx”,它将调用app.doScript。
try {
    app.doScript(new File("/c/doscript_vs_evalfile/called_by_doScript.jsx"));
    "Success";
}
catch (e) {
    var sError = "Encountered " + e.name + " #" + e.number + " at line " + e.line + " of file " + e.fileName + "\n" + e.message;
    app.consoleout(sError);
    sError;
}

这是“called_by_doScript.jsx”文件,它被前一个脚本调用:
app.consoleout("Running called_by_doScript.jsx");
// Produce error
var a = b;

运行批处理文件,这是结果:
02/25/13 13:30:03 INFO  [javascript] Executing File: C:\doscript_vs_evalfile\call_doScript.jsx
02/25/13 13:30:03 INFO  [javascript] Executing File: C:\doscript_vs_evalfile\called_by_doScript.jsx
02/25/13 13:30:03 INFO  [script] Running called_by_doScript.jsx
02/25/13 13:30:03 INFO  [script] Encountered ReferenceError #2 at line 2 of file /c/doscript_vs_evalfile/call_doScript.jsx
b is undefined

注意上面的错误是不正确的。这个错误是由called_by_doScript的第3行引起的,而不是call_doScript的第2行。
现在修改脚本使用$.evalFile,我们得到以下结果:
02/25/13 13:32:39 INFO  [javascript] Executing File: C:\doscript_vs_evalfile\call_evalFile.jsx
02/25/13 13:32:39 INFO  [script] Running called_by_evalFile.jsx
02/25/13 13:32:39 INFO  [script] Encountered ReferenceError #2 at line 3 of file /c/doscript_vs_evalfile/called_by_evalFile.jsx
b is undefined

请注意,错误现在报告的位置是正确的。

编辑:

我发现文档很少。它并没有真正回答我的问题,但它确实描述了不同的可选参数。

doScript:Adobe InDesign CS6脚本指南:JavaScript直接链接
请参阅第16页,“使用doScript方法”

evalFile:Javascript工具指南:Adobe Creative Suite 5
请参阅第219页


1
我不知道答案,但我猜测通过app.doscript,你可以运行js文件和vbs文件。 - bgmCoder
1个回答

9

$.evalFile是ExtendScript的一项功能,而app.doScript是由InDesign实现的。

$.evalFile具有以下特点:

  • 维护$.stack
  • 考虑$.includePath
  • 可以在其他目标应用程序中使用

app.doScript可以:

  • 传递参数
  • 更改语言,例如AppleScript
  • 使用#targetengine来访问其他会话
  • 在支持的范围内修改撤消/事务模式

但是...

  • 嵌套的doScript调用会覆盖参数
  • 在复杂的设置中,当传递超过12个参数后,我很难进行调试。
  • 跨doScript时单步调试会出问题

此外,正如你发现的那样,错误处理也不同。要注意异常...


这些中的任何一个都可以用于远程访问位于Web服务器上的JS文件吗?例如,'http://mywebsite/script.js'? - Carl Papworth
@CarlPapworth 您可以使用 app.doScript 执行一个 AppleScript,以运行一个 do shell script 命令来执行一个 curl 命令。您需要确保引号被正确转义,但这确实可行。不幸的是,这是我在 ExtendScript 中找到的唯一方法。 - spyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接