ADF管道中Get Metadata活动能否递归获取元数据?
在ADF中实现Get Metadata递归获取嵌套文件夹并筛选文件的方案
方法一:递归管道 + Get Metadata + ForEach 循环
这是最直接的原生实现方式,通过递归调用管道遍历所有嵌套层级:
- 新建一个带文件夹路径参数的管道,在其中添加Get Metadata活动,配置源路径为传入的参数值,勾选
子项和项类型字段,获取当前层级的所有文件和文件夹信息
- 新建一个带文件夹路径参数的管道,在其中添加Get Metadata活动,配置源路径为传入的参数值,勾选
- 添加ForEach活动,遍历Get Metadata输出的
@activity('Get Metadata').output.childItems数组
- 添加ForEach活动,遍历Get Metadata输出的
- 在ForEach内部加Condition活动,判断当前项的
@item().type是否等于Folder:
- 若是文件夹:用Execute Pipeline活动调用当前管道,把当前文件夹的完整路径
@item().name拼接后作为参数传入,实现递归遍历 - 若是文件:用Append Variable活动把文件的元数据(如
@item().name、@item().lastModified、完整路径等)添加到一个预先定义的数组变量中
- 在ForEach内部加Condition活动,判断当前项的
- 所有递归完成后,用Filter活动对数组变量中的文件列表按条件筛选,比如按最后修改日期筛选的表达式可以写
@greater(item().lastModified, pipeline().parameters.filterStartDate)
- 所有递归完成后,用Filter活动对数组变量中的文件列表按条件筛选,比如按最后修改日期筛选的表达式可以写
方法二:Copy活动递归列表 + Lookup 批量获取元数据
如果嵌套层级极深,递归管道可能效率不高,可以用这种间接方式:
- 创建Copy活动,源端配置通配符路径(比如
your-container/**)开启递归,目标端选择一个临时存储(如Blob的CSV文件),在源端的列映射里把需要的元数据字段(如文件路径、最后修改日期、大小等)映射到目标CSV的列中
- 创建Copy活动,源端配置通配符路径(比如
- 用Lookup活动读取这个临时CSV文件,得到所有文件的元数据列表
- 用Filter活动对Lookup返回的结果按筛选条件过滤,得到符合要求的文件集合
- 注意:这种方法不需要写递归逻辑,但需要额外的临时存储资源,用完可以添加Delete活动清理临时文件
关键提示
- Get Metadata的
子项字段默认仅返回当前文件夹下的内容,无法直接递归,必须通过循环或其他方式遍历嵌套层级 - 递归管道要注意设置合理的参数传递逻辑,避免出现无限循环的情况
- 筛选条件可以根据需求灵活调整,比如按文件大小、文件名前缀等,只要元数据中包含对应字段即可
内容的提问来源于stack exchange,提问作者user3528204
相关产品推荐
相关产品推荐

