文档相关:JavaScript-Tools-Guide-CC.pdf

一、文件系统访问

1.绝对路径名和相对路径名

URI表示法中的绝对路径名描述了从根目录到特定文件或文件夹的完整路径。它以一个或两个斜杠(/)开始,并用斜杠分隔路径元素。例如,下面描述了myFile.jsx文件的绝对位置:
/dir1/dir2/mydir/myFile.jsx

URI表示法中的相对路径名追加到当前目录的路径,存储在Folder类的全局可用的current属性中。它以文件夹或文件名开始,或以当前目录的特殊名称dot(.)或当前目录的父目录的dot dot(..)之一开始。斜杠(/)分隔路径元素。例如,下面的路径描述了myFile.jsx文件的不同相对位置:
myFile.jsx
./ myFile.jsx    在当前目录中。
. . / myFile     jsx在当前目录的父目录中。
. . / . . / myFile.jsx    在当前目录的祖父目录中。
. . / dir1 / myFile.jsx      dir1中的jsx,它与当前目录平行。

相对路径名独立于不同机器和操作系统上的不同卷名,因此使代码的可移植性大大提高。例如,您可以为单个操作使用绝对路径来设置文件夹中的当前目录。属性,并为所有其他操作使用相对路径。然后,只需进行一次代码更改就可以将其更新到新的平台或文件位置。

2.文件对象

以独立于平台的方式表示本地文件系统中的文件。除非另有说明,否则所有属性和方法都会自动解析文件系统别名,并对原始文件起作用
要创建File对象,请使用File函数或new操作符。构造函数接受完整或部分路径名,并返回新的对象。文件的CRLF顺序为系统默认值,编码为系统默认值。
File ([path]); //can return a Folder object
new File ([path]); //always returns a File object

文件类属性

fs String文件系统名称。只读的。Windows、Macintosh, 或Unix系统之一。

文件类函数

decode()
File.decode (uri)

encode()
File.encode (name)

isEncodingAvailable()
File.isEncodingAvailable (name)

openDialog()
File.openDialog ([prompt, filter, multiSelect])

openDialog()
File.openDialog ([prompt, filter, multiSelect])

文件属性对象

absoluteURI String 引用文件的URI表示法的完整路径名。只读

alias Boolean 当为true时,该对象引用文件系统别名或快捷方式。只读的。

created Date 引用文件的创建日期,如果对象没有创建,则为空

creator String 在Mac OS中,文件创建者是一个4个字符的字符串. In Windows or UNIX,值是 "????". 只读的.

displayName String 引用文件的本地化名称,不包括路径。只读

encoding String 获取或设置后续读写操作的编码。之一在“文件和文件夹支持的编码”中列出的编码常量名字"在45页。如果不能识别该值,则使用系统

默认的编码。一种特殊的编码器,二进制,用来读取二进制文件。它存储每个字节作为一个Unicode字符,而不管任何编码。当写入时,每个Unicode字符的较低字节被视为单个字节字节写。

eof Boolean 当为true时,读取尝试将导致当前位置位于末尾该文件,或该文件未打开。只读的。

error String 描述最后一个文件系统错误的消息;参见“文件访问错误”在第44页。通常由文件系统设置,但是脚本也可以设置它。设置此值将清除任何错误消息并重置错误位打开文件。如果没有错误,则包含空字符串。

exists Boolean 当为true时,该对象引用一个文件或文件系统别名文件系统中存在。只读

fsName String 引用文件的特定于平台的完整路径名。只读的。

fullName String 在URI表示法中引用文件的完整路径名。只读。

hidden Boolean 读/写。如果对象引用文件系统别名或快捷方式,则标记在别名上被更改,而不是在原始文件上。

length Number 只能设置为未打开的文件,在在这种情况下,它会将文件截断或以0字节填充为新的长度。

lineFeed String 如何在文件系统中写入换行符. One of:
           Windows — Windows style
          Macintosh — Mac OS style
           Unix — UNIX style

localizedName String 用的文件,没有路径规范。只读的。

modified Date 不指向磁盘上的文件。只读的。

name String 所引用文件的绝对URI的文件名部分,不包含 路径规范。 只读。

parent Folder 包含此文件的文件夹的Folder对象。 只读
path String 引用文件的绝对URI的路径部分,不包含文件名。只读的。

relativeURI String 引用文件的URI表示法的路径名当前文件夹。只读的。

relativeURI String 相对于当前文件夹的URI表示法中的引用文件的路径名。 只读。

type String 文件类型为4个字符的字符串。

Mac OS下的Mac OS文件类型。

在Windows中,“appl”用于。exe文件,“shlb”用于。dll文件和“TEXT”

对于任何其他文件。

如果文件不存在,则为“????”。只读

文件对象函数

changePath()
fileObj.changePath (path)

close()
fileObj.close ()

close()
fileObj.close ()

createAlias()
fileObj.createAlias (path])

execute()
fileObj.execute ()

getRelativeURI()
fileObj.getRelativeURI ([basePath])

open()
fileObj.open (mode[,type][,creator])

openDlg()
fileObj.OpenDlg ([prompt][,filter][,multiSelect])

read()
fileObj.read ([chars])

readch()
fileObj.readch ()

readln()
fileObj.readln ()

remove()
fileObj.remove ()

rename()
fileObj.rename (newName)

resolve()
fileObj.resolve ()

saveDlg()
fileObj.saveDlg ([prompt][,preset])

seek()
fileObj.seek (pos[, mode])

tell()
fileObj.tell ()

write()
fileObj.write (text[, text...]...)

writeln()
fileObj.writeln (text[, text...]...)

3.文件夹对象参考

... ...

二、用户界面工具 - SCriptUI

Adobe提供了ScriptUI组件,该组件与ExtendScript JavaScript解释器一起工作,以提供能够创建和与用户界面元素交互的JavaScript脚本。它为Adobe应用程序中的windows和用户界面控制元素提供了对象模型。

随adobe extend script SDK分发的示例代码包括一些代码示例(位于C:\Program Files (x86)\Adobe\Adobe ExtendScript Toolkit CC\SDK\Samples\javascript),这些代码示例具体演示了构建和填充ScriptUI对话框的不同方法。打包下载:Adobe ExtendScript Toolkit CC 自带案例

SnpCreateDialog.jsx  创建一个非常简单的、非模态对话框(一个调色板),带有OK和Cancel按钮行为

SnpCreateUIAddMethod.jsx   演示如何使用add方法向对话框添加控件。

... ...

注意:案例创建windows对象是palette,那么窗口会不等待直接退出,最好把palette换成dialog.比如

function SnpCreateDialog()
{this.windowRef = null;
}/**Functional part of this snippet. Create a window of type "palette" (a modeless dialog) and display it.@return True if the snippet ran as expected, false otherwise.@type Boolean
*/
SnpCreateDialog.prototype.run = function()
{// Create a window of type palette.var win = new Window("dialog", "SnpCreateDialog",[100,100,380,245]);  // bounds = [left, top, right, bottom]this.windowRef = win;// Add a frame for the contents.win.btnPanel = win.add("panel", [25,15,255,130], "SnpCreateDialog");// Add the components, two buttonswin.btnPanel.okBtn = win.btnPanel.add("button", [15,65,105,85], "OK");win.btnPanel.cancelBtn = win.btnPanel.add("button", [120, 65, 210, 85], "Cancel");// Register event listeners that define the button behaviorwin.btnPanel.okBtn.onClick = function() {$.writeln("OK pressed");win.close();};win.btnPanel.cancelBtn.onClick = function() {$.writeln("Cancel pressed");win.close();};// Display the windowwin.show();return true;}/**"main program": construct an anonymous instance and run itas long as we are not unit-testing this snippet.
*/
if(typeof(SnpCreateDialog_unitTest) == "undefined") {new SnpCreateDialog().run();
}

ScriptUI对象参考

... ...

三、使用脚本进行应用程序间通信

Adobe脚本环境提供了应用程序间消息传递框架,用于从一个Adobe应用程序向另一个Adobe应用程序发送和接收信息和脚本。支持消息传递框架的应用程序被称为启用消息。
Adobe ExtendScript SDK提供了演示各种技术的代码示例,并在相关章节中按名称引用。

1.Cross-DOM functions

跨dom是一个小型应用程序编程接口(API),它提供了一组在支持消息的应用程序中很常见的函数。这些函数包括打开文件、执行脚本和打印文件。

中间件位于:C:\Program Files (x86)\Common Files\Adobe\Startup Scripts CC\Adobe Photoshop\photoshop.jsx

Cross-DOM API参考

executeScript()
appspec.executeScript(script)

open()
appspec.open(files)

openAsNew()
appspec.openAsNew([options])

print()
appspec.print(files)

quit()
appspec.quit()

reveal()
appspec.reveal(file)

用法

photoshop.executeScript (alert(1));

2.BridgeTalk

Adobe Bridge提供了一个应用程序编程接口(API),它定义了支持adobeextendscript和消息的应用程序之间的通信协议。这为应用程序之间的通信提供了最通用的机制。启用消息传递的应用程序可以启动另一个启用消息传递的应用程序,并发送或接收脚本来执行某些操作。例如,在Adobe Bridge内部,一个脚本可以启动Photoshop,然后向Photoshop发送一个请求photomerge操作的脚本。

虽然导出的函数允许访问应用程序的特定功能,但应用程序间消息中的脚本允许完全访问目标应用程序的文档对象模型(document object model, DOM),以及所有跨DOM和应用程序导出函数。

消息传递API定义了BridgeTalk类,该类的全局可用静态属性和函数提供了对与应用程序之间通信相关的环境信息的访问。您可以实例化这个类来创建一个BridgeTalk消息对象,该对象封装消息并允许您将其发送到另一个应用程序。有关这些对象的详细信息,请参阅179页的“消息传递框架API参考”。

消息传递框架API参考

这个应用程序编程接口(API)定义了启用消息的应用程序之间的通信协议。加载任何应用程序时,所有ExtendScript脚本都可以使用这些对象。

消息传递协议是可扩展的。尽管它主要用于发送脚本,但您也可以使用它发送其他类型的数据。

消息传递API定义了BridgeTalk类。该类的静态属性和方法提供了对与应用程序之间通信相关的环境信息的访问。实例化该类以创建BridgeTalk消息对象,该对象封装了消息本身。有关讨论和示例,请参阅第170页的“通过消息进行通信”,以及提供的示例代码Adobe ExtendScript SDK,打包下载:Adobe ExtendScript Toolkit CC 自带案例

MessagingBetweenApps.jsx
MessageSendingToInDesign.jsx  演示如何向creativesuite应用程序发送消息并接收响应。

SendArrayToPhotoshop.jsx  发送消息给Photoshop,在目标中创建一个数组并将其传回给发送者。
SendObjectToPhotoshop.jsx  发送消息给Photoshop,在目标中创建一个JavaScript对象并将其传回给发送者。
SendDOMObjectToPhotoshop.jsx  发送消息给Photoshop,创建一个Photoshop对象在目标中,并将值从它传递回发送者。
SaveAsDifferentFileType.jsx  定位一个图像文件,使用消息传递将其加载到Photoshop中,并将其保存为不同的文件类型。

BridgeTalk消息对象

......

四、外部通信工具

ExtendScript提供了使用标准协议与其他计算机或因特网通信的工具。

Socket对象支持低级TCP连接

TCP连接是Internet的基本传输层。每次您的Web浏览器连接到服务器并请求一个新页面时,它都会打开一个TCP连接以处理请求以及服务器的答复。JavaScript Socket对象使您可以连接到Internet上的任何服务器,并与此服务器交换数据。

Socket对象提供了通过TCP / IP网络或Internet连接到远程计算机的基本功能。它提供类似于open()和的呼叫,close()以建立或终止连接, read()write()转移数据。该listen()方法建立了一个简单的互联网服务器。服务器使用该方法poll()检查传入连接。

这些连接中的许多连接都是基于ASCII数据的简单数据交换,而其他协议(例如FTP协议)则更为复杂,并且涉及二进制数据。最简单的协议之一是HTTP协议。

下面的示例TCP / IP客户端连接到WWW服务器(侦听端口80);然后,它发送一个非常简单的HTTP GET请求以获取WWW服务器的主页,然后读取答复,该答复是该主页以及一个HTTP响应标头:

conn = new Socket;// access Adobe's home page
if (conn.open ("www.adobe.com:80")) {// send a HTTP GET requestconn.write ("GET /index.html HTTP/1.0\n\n");// and read the server's replyreply = conn.read(999999);conn.close();
}

执行此代码后,该变量reply包含Adobe主页的内容以及HTTP响应标头。

建立Internet服务器要复杂一些。一个典型的服务器程序会坐下来等待传入的连接,然后由它处理。通常,您不希望您的应用程序在无限循环中运行,等待任何传入的连接请求。因此,您可以通过调用对象的poll()方法向Socket对象请求传入的连接Socket

该调用将只检查传入的连接,然后立即返回。如果存在连接请求,则对的调用poll()将返回另一个包含全新连接的Socket对象。使用此连接对象与调用客户端进行对话;完成后,关闭连接并丢弃连接对象。

Socket对象能够检查传入连接之前,必须让对象侦听特定端口(例如HTTP请求的端口80)上的侦听。通过调用listen()方法而不是方法来执行此操作open() 。

下面的示例是一个非常简单的Web服务器。它侦听端口80,等待直到检测到传入请求。HTTP标头被丢弃,并且一个伪HTML页面被发送给调用者:

// listen on port 80
if (conn.listen (80)) {// wait forever for a connectionvar incoming;do incoming = conn.poll();while (incoming == null);// discard the requestconn.read();// Reply with a HTTP headerincoming.writeln ("HTTP/1.0 200 OK");incoming.writeln ("Content-Type: text/html");incoming.writeln();// Transmit a dummy homepageincoming.writeln ("<html><body><h1>Homepage</h1></body></html>");// done!incoming.close();delete incoming;
}

通常,远程端点在传输数据后终止连接。因此,只要连接仍然存在,就存在一个包含true的connected属性。如果connected属性返回false,则连接将自动关闭。

错误时,对象的error属性Socket包含一条描述错误类型的短消息。

通过Socket对象,您可以轻松实现可通过Internet相互通信的软件。例如,您可以通过编写和执行JavaScript程序,让两个Adobe应用程序交换文档和数据。

聊天服务器样本

下面的示例代码实现了一个非常简单的聊天服务器。聊天客户端可能会连接到正在侦听端口号1234的聊天服务器。服务器以欢迎消息进行响应,并等待来自客户端的一行输入。客户端键入一些文本并将其传输到服务器,服务器将显示该文本,并让服务器计算机上的用户键入一行文本,客户端计算机将再次显示该文本行。这样反复进行,直到服务器或客户端计算机键入单词“ bye”:

// A simple Chat server on port 1234
function chatServer() {var tcp = new Socket;// listen on port 1234writeln ("Chat server listening on port 1234");if (tcp.listen (1234)) {for (;;) {// poll for a new connectionvar connection = tcp.poll();if (connection != null) {writeln ("Connection from " + connection.host);// we have a new connection, so welcome and chat// until client terminates the sessionconnection.writeln ("Welcome to a little chat!");chat (connection);connection.writeln ( "*** Goodbye ***");connection.close();delete connection;writeln ("Connection closed");}}}
}function chatClient() {var connection = new Socket;// connect to sample serverif (connection.open ("remote-pc.corp.adobe.com:1234")) {// then chat with serverchat (connection);connection.close();delete connection;}
}function chat (c) {// select a long timeoutc.timeout=1000;while (true) {// get one line and echo itwriteln (c.read());// stop if the connection is brokenif (!c.connected)break;// read a line of textwrite ("chat: ");var text = readln();if (text == "bye")// stop conversation if the user entered "bye"break;else// otherwise transmit to serverc.writeln (text);}
}

套接字对象参考

... ...

五、集成外部库

您可以通过编写C或C ++共享库,针对正在使用的平台进行编译并将其作为ExternalObject对象加载到JavaScript中来扩展应用程序的JavaScript DOM。共享库由Windows中的DLL,Mac OS中的捆绑包或框架或UNIX中的SharedObject实现。

您可以直接通过ExternalObject实例访问库函数,也可以定义一个接口,该接口允许您的C / C ++代码创建和访问JavaScript类和对象。

加载和使用共享库

要将外部共享库加载到JavaScript中,请创建一个新的ExternalObject对象。该实例充当库的JavaScript接口的容器和管理器。它提供了一个日志记录工具,该工具将状态信息打印到ExtendScript Toolkit中的JavaScript控制台,以帮助您调试外部库的使用。

加载库后,其导出的符号可用于JavaScript。在JavaScript代码中,您可以直接在ExternalObject实例中调用库中定义的函数,也可以通过库定义的对象类型间接调用。

  • 通过ExternalObject实例直接访问库调用-对C语言库使用直接访问样式。对于C库中定义的每个函数,在ExternalObject对象中都有一个对应的方法。您可以将数据传递给这些方法并直接接收返回值。

    例如:

    mylib = new ExternalObject ("lib:" + samplelib); // load the library
    alert(mylib.version) ;
    // access functions directly from ExternalObject instance
    var a = mylib.method_abc(1,2.0,true, "this is data") ;
    alert(a) ;
    mylib.unload() ;

    通过JavaScript类间接访问库调用-使用间接样式访问C ++库中定义的类。对于库中定义的每个C ++类,都会自动定义一个对应的JavaScript类,您可以通过该类的实例访问属性和方法。例如:

  • alert(anotherlib.version) ;
    // instantiate library-defined class
    var myObject = new MyNewClass() ;
    // access functions from instance
    var a = myObject.method_abc(1,2.0,true,"this is data") ;
    alert(a) ;
    anotherlib.unload() ;

    ExternalObject对象

    您可以在构造函数中指定库的名称。构造函数使用静态属性 ExternalObject.searchFolders 中定义的路径搜索命名库。

  • obj = new ExternalObject ("lib:" + filespec, arg1, ...argn);

    例如:

    var mylib = new ExternalObject( "lib:myLibrary" );

    ExternalObject怎么用的我还是没学会。。。。。。

六、ExtendScript工具和特性

除了特定的功能模块和开发工具,ExtendScript还提供了以下工具和特性:

支持调试和对象检查的全局对象;其中包括Dollar($)对象和ExtendScript反射接口。

一个本地化实用程序,用于以不同语言提供用户界面字符串值。参见本地化ExtendScript字符串。

在对话框中显示短消息的全局功能。参见用户通知对话框。

指定测量值及其单位的对象类型。看到指定测量值。

预处理器指令,允许您在彼此中包含脚本并指定执行目标应用程序。

支持在一个类一个类的基础上扩展或重写数学和逻辑操作符行为。操作符重载。

反射用法:

function reflectProps(obj) {var props = obj.reflect.properties;for (var i = 0, len = props.length; i < len; i++) {try {$.writeln(props[i].name + ' = ' + obj[props[i].name]);} catch (e) {}}
}function reflectMeths(obj) {var meths = obj.reflect.methods;for (var i = 0, len = meths.length; i < len; i++) {try {$.writeln(meths[i].name + '();');} catch (e) {}}
}// Example of use:var lay = app.activeDocument.activeLayer;reflectProps(lay);reflectMeths(lay);

七、将XML集成到JavaScript

ExtendScript定义XML对象,该对象使您可以使用JavaScript脚本处理XML。


var currentFolder = new File($.fileName).path;
var xmlFile = new File(currentFolder + '/presets.xml');
xmlFile.open('r');
var xmlContent = xmlFile.read();
xmlFile.close();
var xmlObj = new XML(xmlContent); // XML Object
alert(xmlObj)

八、对XMP元数据的脚本访问

XMPScript, XMP ExtendScript API,提供JavaScript访问Adobe XMP核心和XMP文件库。本章提供了与XMP相关的JavaScript对象及其属性和方法的参考信息。

Photoshop脚本入门(三)- ExtendScript 核心技术相关推荐

  1. Photoshop脚本入门(二)- JavaScript脚本参考

    JavaScript脚本参考是基于DOM文档对象模型的资料 一.Adobe Photoshop CC 提供JavaScript支持 本参考资料描述了Adobe®Photoshop®CC®JavaScr ...

  2. Photoshop脚本开发环境

    Photoshop脚本开发环境 ExtendScript Toolkit 下载: 查看PS提供的API SDK路径 更多ps脚本开发教程,请点击Photoshop脚本学习之路-链接集合 Photosh ...

  3. Photoshop脚本从入门到精通视频教程-李发展-专题视频课程

    Photoshop脚本从入门到精通视频教程-36859人已学习 课程介绍         PhotoShop脚本是 Photoshop神秘,也是强大的一个功能. 它可以允许您以代码的方式来操作文档.美 ...

  4. Linux Shell脚本入门教程系列之(三)Shell变量

    本文是Linux Shell脚本系列教程的第(三)篇,更多shell教程请看:Linux Shell脚本系列教程 Shell作为一种高级的脚本类语言,也是支持自定义变量的.继上一篇之后,今天就为大家介 ...

  5. Photoshop 脚本指南

    Photoshop 脚本指南 一. 介绍 关于本手册: 约定 二. Photoshop脚本基础 脚本概览 为什么使用脚本而不是动作? Photoshop中的脚本支持 JavaScript支持 执行其他 ...

  6. photoshop脚本指南_如何学习Photoshop的极客指南,第1部分:工具箱

    photoshop脚本指南 Photoshop is one of the most intimidating programs for any beginner, but has powerful ...

  7. Linux之Shell脚本入门

    一.Shell概述 Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核. Shell还是一个功能强大的编程语言,易编写.易调试.灵活性强. 二.Shell脚本入门 1.脚本格 ...

  8. Photoshop脚本指南——Hello World

    作为一个程序猿,每一个东西的学习都是从Hello World开始的,从今天开始,让我们一起进入Photoshop脚本的世界,并以Hello World开始我们的旅程. 1.简介 Photoshop支持 ...

  9. Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

最新文章

  1. angular.foreach 格式
  2. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~
  3. 细说Android事件传递
  4. DEARGUI的安装
  5. algorithm头文件下的常用函数
  6. 十一、Grafana监控系统
  7. php xml expat,PHP 使用 XML Expat 解释xml文件
  8. php执行另一个页面,从另一个PHP脚本执行PHP脚本
  9. 你是愛我還是需要我?
  10. Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)
  11. python乱码怎么办_Python爬虫结果是乱码怎么办?带你了解乱码的原因及其解决办法...
  12. UE5全局光照系统Lumen解析与优化
  13. 解决Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
  14. 线性变换(1)——不变子空间
  15. 自律给我自由 2017.8.9   心情很好   天气很好
  16. HTML5:移动端开发入门
  17. FFmpeg —— librtmp的安装(linux)
  18. Unity中常用到的基础函数
  19. CodeVIO:基于可学习优化密集深度的视觉惯性里程计(ICRA2021)
  20. QT5制作MD5加密校验工具

热门文章

  1. Linux cd命令cd、 cd ~、cd /、cd../、cd /home
  2. c++ ——初次见面,请多指教
  3. git push -u origin master后要输入密码输入不了?
  4. mathtype在html中无法显示,MathType公式不显示或者显示为空格怎么解决
  5. Linux内核配置解析 - 概述(基于ARM64架构)
  6. 数据库 函数依赖及范式(最通俗易懂)
  7. 手指放在手机摄像头和闪光灯前检测心率的应用是什么原理?
  8. 导包时import花括号{}的作用
  9. Android实现从左往右TextView淡入淡出渐变效果
  10. 魔兽世界会怀旧服 不显示服务器列表,《魔兽世界》怀旧服:这些服务器名称,只有经历过60年代的玩家懂...