2026-04-25 02:35:18
在Zotero中直接使用JavaScript脚本清理残留PDF附件的方法
核心答案在Zotero中,可通过内置的JavaScript脚本功能清理ZotFile插件删除条目后残留的PDF附件,无需安装额外软件。具体步骤如下:
导出Zotero库为.zip备份(文件 > 导出库)。
手动复制ZotFile附件目录(路径通过ZotFile插件设置 > 目标目录查看)。
打开JavaScript控制台:
在Zotero中依次点击:Tools > Developer > Run JavaScript。

粘贴脚本代码:将以下代码复制到控制台左侧窗口:
var truthBeTold = window.confirm("所有附件的清理不可恢复,单击“确定”继续。单击“取消”停止。");if (truthBeTold) { // 清理zotfile目录 var AllFiles = []; // 当前库中所有附件文件名 var DirFiles = []; // ZotFile目录中的文件 var DelFileNum = 0; // 被清理的文件计数 var path = Zotero.ZotFile.getPref("dest_dir"); // 获取ZotFile目录路径 var FullPath = ''; // 文件完整路径 var OutText = ""; // 输出日志 // 获取库中所有附件 var s = new Zotero.Search(); s.libraryID = Zotero.Libraries.userLibraryID; var results = await s.search(); var items = await Zotero.Items.getAsync(results); for (let item of items) { let file = await getFilePath(item); if (file) { AllFiles.push(OS.Path.basename(file)); // 仅存储文件名 } } // 获取ZotFile目录中的文件列表 await Zotero.File.iterateDirectory(path, async function(entry) { if (!entry.isDir) { DirFiles.push(entry.name); } }); // 对比并删除残留文件 for (let DirFile of DirFiles) { if (AllFiles.indexOf(DirFile) == -1) { DelFileNum += 1; FullPath = OS.Path.join(path, DirFile); OutText += DelFileNum + ": " + DirFile + "n"; await OS.File.remove(FullPath); // 实际删除操作 } } alert(DelFileNum + "个文件被清理。n被清理的文件:n" + OutText);}// 辅助函数:获取条目附件路径async function getFilePath(item) { if (item && !item.isNote()) { if (item.isRegularItem()) { let attachmentIDs = item.getAttachments(); for (let id of attachmentIDs) { var file = await Zotero.Items.get(id).getFilePathAsync(); return file; } } if (item.isAttachment()) { var file = await item.getFilePathAsync(); return file; } }}测试模式(可选):
若需先查看将被删除的文件而不实际删除,注释掉删除行:
// await OS.File.remove(FullPath); // 删除文件运行脚本后,检查弹窗列出的文件列表,确认无误后再取消注释执行删除。
执行清理:
点击Run,确认提示后,脚本将自动删除残留文件并显示结果。
路径限制:
ZotFile目录路径避免使用中文或特殊字符,否则可能导致脚本读取失败。
文件范围:
脚本仅删除ZotFile目录中未被任何条目引用的文件。确保该目录下无手动存放的其他文件。
日志记录:
脚本会弹窗显示被删除的文件名及数量,建议截图保存日志以便追溯。
此方法无需Python环境,直接利用Zotero内置功能,适合希望简化清理流程的用户。