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

如何通过ADF删除Azure文件共享文件夹内的文件和子目录但保留该文件夹

解决Azure Data Factory清空指定文件夹内容但保留文件夹的问题

针对你需要清空EXPORT/IN/REF-A这类文件夹内所有文件和子目录、但保留原文件夹的需求,以下是无需嵌套Foreach或额外管道的可行方案:

方案1:单Foreach + Get Metadata组合(纯ADF原生组件)

无需嵌套,通过一次Get Metadata获取所有一级子项,再用单个Foreach递归删除:

  1. Get Metadata活动:
    • 配置Azure文件共享数据集,路径设为目标文件夹(如EXPORT/IN/REF-A)
    • 勾选Child items字段,获取该文件夹下的所有一级文件和子目录
  2. Foreach活动:
    • 迭代Get Metadata输出的@activity('Get Metadata').output.childItems数组
    • 内部添加删除活动:
      • 数据集路径动态设置为@concat('EXPORT/IN/REF-A/', item().name)
      • 开启Delete recursive选项:此选项会自动递归删除子目录内的所有内容,再删除子目录本身;对于文件则直接删除
    • 执行后,目标文件夹将被完全清空,自身保留

方案2:Web活动调用Azure PowerShell Runbook

通过自动化账户的Runbook执行PowerShell脚本,一次性完成清空操作:

  1. 创建Azure自动化账户,编写Runbook脚本:
$storageAccountName = "你的存储账户名"
$storageAccountKey = "你的存储账户密钥"
$fileShareName = "你的文件共享名"
$targetFolder = "EXPORT/IN/REF-A"

$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
$items = Get-AzStorageFile -Context $context -ShareName $fileShareName -Path $targetFolder | Get-AzStorageFile

foreach ($item in $items) {
    if ($item -is [Microsoft.WindowsAzure.Storage.File.CloudFile]) {
        Remove-AzStorageFile -Context $context -ShareName $fileShareName -Path "$targetFolder/$($item.Name)" -Force
    } elseif ($item -is [Microsoft.WindowsAzure.Storage.File.CloudFileDirectory]) {
        Remove-AzStorageFileDirectory -Context $context -ShareName $fileShareName -Path "$targetFolder/$($item.Name)" -Force -Recurse
    }
}
  1. 在ADF中添加Web活动:
    • 选择Azure资源类型,关联你的订阅,资源类型选Microsoft.Automation/automationAccounts
    • 选择目标自动化账户,操作选runbook/start/invoke,传入必要参数(如目标文件夹路径)
    • 确保自动化账户拥有存储账户的Storage File Data Contributor权限

方案3:Azure Function + Web活动

创建HTTP触发的Azure Function,通过代码实现清空逻辑,再用ADF Web活动调用:
Python示例Function代码:

import azure.functions as func
from azure.storage.fileshare import ShareServiceClient

def main(req: func.HttpRequest) -> func.HttpResponse:
    storage_acc_name = "你的存储账户名"
    storage_acc_key = "你的存储账户密钥"
    share_name = "你的文件共享名"
    target_folder = req.params.get("folder") or "EXPORT/IN/REF-A"

    try:
        service_client = ShareServiceClient(
            account_url=f"https://{storage_acc_name}.file.core.windows.net/",
            credential=storage_acc_key
        )
        dir_client = service_client.get_share_client(share_name).get_directory_client(target_folder)

        # 删除所有文件和子目录
        for item in dir_client.list_directories_and_files():
            if item.is_file:
                dir_client.delete_file(item.name)
            else:
                dir_client.get_subdirectory_client(item.name).delete_directory(recursive=True)

        return func.HttpResponse(f"Folder {target_folder} cleared successfully")
    except Exception as e:
        return func.HttpResponse(f"Error: {str(e)}", status_code=500)

在ADF的Web活动中调用该Function的URL,传递folder参数指定目标路径即可。


内容的提问来源于stack exchange,提问作者Nguyen Tung Son

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:12:23