编写文件资源管理器按钮脚本:按年龄重命名照片遇元数据问题求助
照片按年龄重命名脚本修复方案
需求:选中照片后点击按钮,按人物年龄重命名(示例:Esther.jpg → Esther (1y 3m 8d).jpg),年龄由脚本固定的出生日期和照片拍摄日期(从元数据获取)计算得出。
原代码运行时第4行报错:'metadata'为null或非对象,无法正确获取拍摄日期,原代码如下:
function OnGetNewName(getNewNameData) { var birthdate = "20210318000000"; var dateTaken = item.metadata.image.datetaken; var diff = dateTaken - birthdate; var age = "(" + diff.getFullYear() + "y " + diff.getMonth() + "m " + diff.getDate() + "d)"; var item = getNewNameData.item; var result = item.name_stem + age + item.ext; return result; }
错误原因
- 变量顺序颠倒:在访问
item.metadata前未定义item变量,原代码中var item = getNewNameData.item;在第8行,却提前在第4行使用了item - 元数据无容错处理:部分照片可能缺失拍摄日期元数据,直接访问会导致
metadata或datetaken为null - 日期计算逻辑错误:直接用字符串相减无法得到有效时间差,需先转为
Date对象再计算年龄
修复后的代码
function OnGetNewName(getNewNameData) { // 获取当前文件对象 var item = getNewNameData.item; // 固定出生日期(格式:YYYYMMDDHHMMSS) var birthStr = "20210318000000"; // 检查元数据及拍摄日期是否存在 if (!item.metadata || !item.metadata.image || !item.metadata.image.datetaken) { // 无拍摄日期时返回原文件名 return item.name; } // 将字符串转为Date对象 // 解析出生日期:YYYYMMDDHHMMSS → 拆分成年、月、日等(月份从0开始) var birthDate = new Date( parseInt(birthStr.substr(0,4)), parseInt(birthStr.substr(4,2)) - 1, parseInt(birthStr.substr(6,2)), parseInt(birthStr.substr(8,2)), parseInt(birthStr.substr(10,2)), parseInt(birthStr.substr(12,2)) ); // 拍摄日期转为Date对象 var dateTaken = new Date(item.metadata.image.datetaken); // 计算精确年龄(年、月、日) var years = dateTaken.getFullYear() - birthDate.getFullYear(); var months = dateTaken.getMonth() - birthDate.getMonth(); var days = dateTaken.getDate() - birthDate.getDate(); // 处理月份借位:如果月份差为负,年数减1,月份补12 if (months < 0) { years--; months += 12; } // 处理天数借位:如果天数差为负,月份减1,天数补对应月份的天数 if (days < 0) { months--; var prevMonth = new Date(dateTaken.getFullYear(), dateTaken.getMonth(), 0); days += prevMonth.getDate(); } // 拼接新文件名 var ageStr = `(${years}y ${months}m ${days}d)`; var newName = item.name_stem + ageStr + item.ext; return newName; }
关键说明
- 元数据容错:增加了对
metadata、image、datetaken的存在性检查,避免无元数据时报错 - 日期解析:将固定格式的出生日期字符串拆分为年、月、日等参数,转为
Date对象(注意月份是0起始) - 精确年龄计算:处理了月份和天数的借位问题,避免出现负数或不合理的数值
- 兼容无元数据场景:当照片无拍摄日期时,直接返回原文件名,不中断重命名流程
内容的提问来源于stack exchange,提问作者user21343839
相关产品推荐
相关产品推荐

