Photoshop脚本 文件系统
ExtendScript 内置了 File 和 Folder 对象,用于访问本地文件系统。这些是 Adobe 跨平台文件操作 API,不同于 Node.js 的 fs 模块,也不同于浏览器中的 File API。
File 对象
File 对象代表一个文件引用,可以检查属性、读写内容:
javascript
// 创建文件引用(路径支持反斜杠和正斜杠)
var file = new File("C:/Users/Administrator/Desktop/example.psd");
// 路径可以是绝对路径或相对路径
var absolute = new File("/c/Users/用户名/Desktop/test.psd"); 文件属性
javascript
var file = new File("C:/Users/Administrator/Documents/test.psd");
alert("是否存在: " + file.exists + "\n文件名: " + file.name + "\n路径: " + file.path + "\n完整路径: " + file.fsName + "\n显示名: " + file.displayName + "\n扩展名: " + file.type + "\n大小: " + file.length + " 字节" + "\n修改时间: " + file.modified + "\n编码: " + file.encoding); name、path、fsName、displayName 等返回路径字符串的属性,在包含中文等非 ASCII 字符时会被 URL 编码(例如 中文 → %E4%B8%AD%E6%96%87)。使用 decodeURI() 还原: javascript
var file = new File("C:/Users/Administrator/Desktop/中文文档.psd");
alert(file.name + "\n" + decodeURI(file.name)); 这是在 alert() 输出或日志记录时常见的陷阱。
文件编码
File.encoding 控制文件读写的字符编码,需要在 open() 之前设置:
javascript
var file = new File("C:/Users/Administrator/Desktop/data.txt");
file.encoding = "UTF8"; // 必须在 open 之前设置
file.open("w");
file.write("包含中文的内容");
file.close(); 常用编码值:
| 编码 | 适用场景 |
|---|---|
"UTF8" | 跨平台兼容、Web 场景推荐 |
"GBK" | 中文 Windows 系统默认(仅限 Windows) |
"Shift-JIS" | 日文系统 |
"ISO-8859-1" | 西欧语言 |
不设置编码时,ExtendScript 使用操作系统默认编码(中文 Windows 为 GBK,macOS 为 UTF-8)。如果生成的文本文件需要跨平台使用或在 Web 上展示,始终显式设置 encoding = "UTF8"。
换行符
File.lineFeed 控制写入的换行符类型,同样在 open() 之前设置:
javascript
file.lineFeed = "Windows"; // CRLF (\r\n)
// file.lineFeed = "Macintosh"; // CR (\r)
// file.lineFeed = "Unix"; // LF (\n) 读写文件
javascript
// 写入文件(含编码设置)
var outFile = new File("C:/Users/Administrator/Desktop/output.txt");
outFile.encoding = "UTF8"; // 跨平台兼容,确保中文正确
outFile.lineFeed = "Windows"; // 换行符类型
outFile.open("w"); // "w" 写入模式
outFile.write("Hello, ExtendScript!\n");
outFile.writeln("包含中文的内容");
outFile.close();
// 读取文件(编码需匹配写入时的设置)
var inFile = new File("C:/Users/Administrator/Desktop/output.txt");
inFile.encoding = "UTF8";
inFile.open("r"); // "r" 读取模式
var content = inFile.read(); // 读取全部内容
alert(content);
inFile.close();
// 逐行读取
inFile.open("r");
while (!inFile.eof) {
var line = inFile.readln();
alert("行: " + line);
}
inFile.close(); 如果文件编码与读取时设置的 encoding 不匹配,中文等非 ASCII 字符会显示为乱码。始终确保写入和读取使用相同的编码。
文件操作
javascript
var file = new File("C:/Users/Administrator/Desktop/test.txt");
file.open("w");
file.write("临时文件");
file.close();
// 复制文件
file.copy("C:/Users/Administrator/Desktop/backup.txt");
// 重命名文件
file.rename("renamed.txt");
// 删除文件
file.remove();
// 用系统默认程序打开文件
var psd = new File("C:/Users/Administrator/Desktop/image.psd");
psd.execute(); // 将用 Photoshop 打开 Folder 对象
Folder 对象代表一个目录引用:
javascript
// 创建文件夹引用
var folder = new Folder("C:/Users/Administrator/Desktop/我的项目");
// 检查是否存在,不存在则创建
if (!folder.exists) {
folder.create();
alert("文件夹已创建");
}
alert("完整路径: " + folder.fsName + "\n名称: " + folder.name + "\n父目录: " + folder.parent); 遍历文件夹
javascript
var folder = new Folder("C:/Users/Administrator/Desktop");
// 获取所有文件,支持通配符过滤
var psdFiles = folder.getFiles("*.psd");
for (var i = 0; i < psdFiles.length; i++) {
}
alert("共找到 " + psdFiles.length + " 个 PSD 文件");
// 获取所有文件和子文件夹(不带通配符)
var fileCount = 0, folderCount = 0;
var allEntries = folder.getFiles();
for (var i = 0; i < allEntries.length; i++) {
var entry = allEntries[i];
if (entry instanceof File) {
fileCount++;
} else if (entry instanceof Folder) {
folderCount++;
}
}
alert("共找到 " + fileCount + " 个文件," + folderCount + " 个文件夹"); 对话框
ExtendScript 提供文件选择对话框,让用户交互式选择文件或文件夹:
javascript
// 打开文件选择对话框
var file = File.openDialog("请选择一个 PSD 文件", "*.psd");
if (file) {
var doc = app.open(file);
alert("已打开: " + decodeURI(file.name));
}
// 保存文件对话框
var saveFile = File.saveDialog("保存为 JPEG",
"未命名.jpg",
"*.jpg");
if (saveFile) {
alert("保存到: " + decodeURI(saveFile.fsName));
}
// 选择文件夹
var folder = Folder.selectDialog("请选择输出目录");
if (folder) {
alert("选择了: " + decodeURI(folder.fsName));
} 实用技巧
执行外部脚本文件
javascript
// 加载并执行另一个 .jsx 文件
$.evalFile(new File("C:/Users/Administrator/Documents/utils.jsx"));
// 如果 utils.jsx 中定义了函数,可以直接调用
processImages(); $.evalFile 在运行时加载脚本,适合用户自定义配置或插件式模块。
对于项目依赖的基础模块(工具函数、配置常量),更推荐使用 #include 指令,编译时即完成文件合并:
javascript
// #include 在脚本保存时即完成文件插入
#include "config.jsxinc"
#include "lib/helpers.jsxinc"
// 编译后即可直接调用被包含文件中定义的函数 两者的选择:
| 场景 | 推荐方式 |
|---|---|
| 静态库、项目依赖 | #include |
| 用户配置文件、插件 | $.evalFile |
批量处理文件夹中的所有 PSD 文件
javascript
var folder = Folder.selectDialog("请选择包含 PSD 的文件夹");
if (!folder) {
alert("未选择文件夹");
} else {
var files = folder.getFiles("*.psd");
for (var i = 0; i < files.length; i++) {
var doc = app.open(files[i]);
// 进行操作...
doc.close(SaveOptions.SAVECHANGES);
}
alert("处理完成!共处理 " + files.length + " 个文件");
} 特殊路径
javascript
// 用户主目录
var home = new Folder("~");
alert("主目录: " + home.fsName);
// 脚本所在目录
var scriptFile = new File($.fileName);
var scriptDir = scriptFile.parent;
alert("脚本目录: " + scriptDir.fsName);
// 临时目录
var tempDir = new Folder(Folder.temp);
alert("临时目录: " + tempDir.fsName);