You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写文件资源管理器按钮脚本:按年龄重命名照片遇元数据问题求助

照片按年龄重命名脚本修复方案

需求:选中照片后点击按钮,按人物年龄重命名(示例: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;
}

错误原因

  1. 变量顺序颠倒:在访问item.metadata前未定义item变量,原代码中var item = getNewNameData.item;在第8行,却提前在第4行使用了item
  2. 元数据无容错处理:部分照片可能缺失拍摄日期元数据,直接访问会导致metadata或datetaken为null
  3. 日期计算逻辑错误:直接用字符串相减无法得到有效时间差,需先转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:42:42