如何通过脚本检查文档Physical file id,对比不匹配时告警
问题分析与脚本修正
你的脚本无论ID匹配与否都会触发告警,核心原因有两个:
String.match()返回的是数组类型,直接用==比较两个数组永远会得到false(数组是引用类型,只有引用同一对象时才相等)- 重复定义了
find_original_document_ID函数,属于冗余代码
另外还有几个潜在问题:
getFiles的过滤逻辑不够严谨,可能误打开其他文件- 未处理ID提取失败的情况(比如文件没有
OriginalDocumentID)
修正后的完整脚本
var srcDoc = app.activeDocument; var ctpath = srcDoc.path; var ctname = srcDoc.name; // 提取OriginalDocumentID的函数(只定义一次) function find_original_document_ID(str) { // 精准提取xmpMM:OriginalDocumentID的引号内值 var regEx = /xmpMM:OriginalDocumentID\s*=\s*"([^"]+)"/i; var result = str.match(regEx); // 返回匹配到的ID字符串,没找到则返回null return result ? result[1] : null; } // 提取当前文档的ID var idCT = find_original_document_ID(srcDoc.xmpMetadata.rawData); if (!idCT) { alert(ctname + " 未找到OriginalDocumentID!"); app.exit(); } // 查找并打开目标_01文件(可根据实际命名调整匹配规则) var targetFiles = Folder(ctpath).getFiles(function(v) { return v.name.includes('_bustfront1') && v instanceof File; }); if (targetFiles.length === 0) { alert("未找到目标_01文件!"); app.exit(); } // 打开第一个匹配的文件 var doc2 = open(targetFiles[0]); var fName = doc2.name; var id01 = find_original_document_ID(doc2.xmpMetadata.rawData); doc2.close(SaveOptions.DONOTSAVECHANGES); if (!id01) { alert(fName + " 未找到OriginalDocumentID!"); app.exit(); } // 字符串直接比较,不匹配则触发告警 if (idCT !== id01) { alert( ctname + " 的OriginalDocumentID:\n" + idCT + "\n\n" + fName + " 的OriginalDocumentID:\n" + id01 + "\n\n⚠️ ID不匹配,请检查文件来源!" ); }
关键修正点说明
- 正则表达式优化:
原正则匹配整行,现在改为精准提取xmpMM:OriginalDocumentID的引号内值,避免多余字符干扰比较。 - 数组转字符串:
函数返回匹配到的ID字符串(result[1]),而非match()返回的数组,确保可以用===直接比较。 - 严谨的文件查找:
用includes()替代indexOf,同时判断是文件类型,避免匹配文件夹;添加文件未找到的判断逻辑。 - 空值处理:
增加ID提取失败的告警,避免后续逻辑出错。 - 安全关闭文件:
用SaveOptions.DONOTSAVECHANGES确保打开的对比文件不会被意外修改。
内容的提问来源于stack exchange,提问作者Tsunami Lâm
相关产品推荐
相关产品推荐

