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

如何修改Photoshop脚本以支持嵌套智能对象内容替换

Photoshop嵌套智能对象批量替换脚本修复方案

问题说明

原脚本支持弹窗选择图片替换智能对象内容,尝试修改使其支持嵌套智能对象(即智能对象内部包含的智能对象)替换,但修改后既没实现嵌套支持,连基础替换功能也失效了。

修复后的完整代码

#target photoshop

if (app.documents.length > 0) {
    var myDocument = app.activeDocument;
    // 全局存储选中的替换文件,避免重复弹窗
    var selectedFiles = null;

    // 启动替换流程
    replaceAllSmartObjectContents(myDocument);
}

// 递归遍历所有图层(包括组、嵌套智能对象内部)
function replaceAllSmartObjectContents(currentLayer) {
    // 处理普通智能对象图层
    if (currentLayer.typename === "ArtLayer" && currentLayer.kind === LayerKind.SMARTOBJECT) {
        // 仅首次触发弹窗选择文件
        if (selectedFiles === null) {
            selectedFiles = selectReplacementFiles();
        }
        // 如果选中了文件,执行替换
        if (selectedFiles) {
            replaceSmartObjectContents(currentLayer, selectedFiles);
        }
    }
    // 处理图层组:递归遍历子图层
    else if (currentLayer.typename === "LayerSet") {
        for (var i = 0; i < currentLayer.layers.length; i++) {
            replaceAllSmartObjectContents(currentLayer.layers[i]);
        }
    }
    // 处理嵌套智能对象:打开智能对象文档,递归处理内部图层
    else if (currentLayer.typename === "Document") {
        for (var j = 0; j < currentLayer.layers.length; j++) {
            replaceAllSmartObjectContents(currentLayer.layers[j]);
        }
        // 保存并关闭嵌套智能对象文档,确保修改同步到父文档
        currentLayer.save();
        currentLayer.close(SaveOptions.DONOTSAVECHANGES);
    }
}

// 弹窗选择替换文件的封装函数
function selectReplacementFiles() {
    var theFiles;
    if ($.os.search(/windows/i) != -1) {
        theFiles = File.openDialog("请选择替换文件", "*.psd;*.tif;*.jpg", true);
    } else {
        theFiles = File.openDialog("请选择替换文件", getFiles, true);
    }
    return theFiles;
}

// 替换单个智能对象内容(含嵌套处理)
function replaceSmartObjectContents(smartObjectLayer, replacementFiles) {
    app.activeDocument.activeLayer = smartObjectLayer;
    // 打开智能对象内部文档,处理嵌套内容
    var nestedDoc = smartObjectLayer.duplicate();
    nestedDoc = app.open(nestedDoc);
    replaceAllSmartObjectContents(nestedDoc);
    
    // 批量替换当前智能对象
    for (var m = 0; m < replacementFiles.length; m++) {
        replaceContents(replacementFiles[m], smartObjectLayer);
        // 可选:将图层重命名为替换文件的名称
        smartObjectLayer.name = replacementFiles[m].name.match(/(.*)\.[^\.]+$/)[1];
    }
}

// 文件筛选函数
function getFiles(theFile) {
    return theFile.name.match(/\.(psd|tif|jpg)$/i) != null || theFile.constructor.name === "Folder";
}

// 核心替换动作(基于Photoshop动作描述符)
function replaceContents(newFile, theSO) {
    app.activeDocument.activeLayer = theSO;
    
    var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    desc.putPath(idnull, new File(newFile));
    var idPgNm = charIDToTypeID("PgNm");
    desc.putInteger(idPgNm, 1);
    executeAction(idplacedLayerReplaceContents, desc, DialogModes.NO);
    
    return app.activeDocument.activeLayer;
}

关键修改点

  • 全局文件选择:将文件选择逻辑抽离为独立函数,仅首次触发弹窗,避免遍历每个智能对象时重复弹窗
  • 嵌套智能对象处理:新增对Document类型的判断,处理智能对象时会打开其内部文档,递归遍历其中的嵌套智能对象,完成后保存关闭以同步修改到父文档
  • 递归逻辑修复:原代码仅遍历图层组,未触达智能对象内部结构;修改后完整覆盖所有层级的智能对象
  • 替换流程优化:分离批量替换与单个智能对象处理逻辑,避免重复操作导致的功能失效
  • 图层命名优化:替换后自动将智能对象图层重命名为替换文件的名称,便于识别

内容的提问来源于stack exchange,提问作者aye cee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:57:40