如何通过ADF删除Azure文件共享文件夹内的文件和子目录但保留该文件夹
解决Azure Data Factory清空指定文件夹内容但保留文件夹的问题
针对你需要清空EXPORT/IN/REF-A这类文件夹内所有文件和子目录、但保留原文件夹的需求,以下是无需嵌套Foreach或额外管道的可行方案:
方案1:单Foreach + Get Metadata组合(纯ADF原生组件)
无需嵌套,通过一次Get Metadata获取所有一级子项,再用单个Foreach递归删除:
- Get Metadata活动:
- 配置Azure文件共享数据集,路径设为目标文件夹(如
EXPORT/IN/REF-A) - 勾选
Child items字段,获取该文件夹下的所有一级文件和子目录
- 配置Azure文件共享数据集,路径设为目标文件夹(如
- Foreach活动:
- 迭代Get Metadata输出的
@activity('Get Metadata').output.childItems数组 - 内部添加删除活动:
- 数据集路径动态设置为
@concat('EXPORT/IN/REF-A/', item().name) - 开启
Delete recursive选项:此选项会自动递归删除子目录内的所有内容,再删除子目录本身;对于文件则直接删除
- 数据集路径动态设置为
- 执行后,目标文件夹将被完全清空,自身保留
- 迭代Get Metadata输出的
方案2:Web活动调用Azure PowerShell Runbook
通过自动化账户的Runbook执行PowerShell脚本,一次性完成清空操作:
- 创建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 } }
- 在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
相关产品推荐
相关产品推荐

