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

PowerShell对比Blob集合:避免重复下载Azure Blob存储文件

解决Azure Blob重复下载问题的PowerShell脚本优化方案

我来帮你搞定这个重复下载的问题!核心思路就是精准筛选出还没有对应.succeeded标记文件的原始Blob,只对这些文件执行下载和标记操作,从根源上避免重复劳动。下面是具体的实现步骤和优化后的脚本:

1. 前期准备与连接存储账户

先确保你已经安装了Azure存储模块,然后连接到目标存储账户:

# 导入Azure存储模块(未安装的话先运行 Install-Module -Name Az.Storage)
Import-Module Az.Storage

# 替换成你的存储账户信息
$storageAccountName = "你的存储账户名"
$storageAccountKey = "你的存储账户密钥"
$containerName = "目标容器名"
$localDownloadFolder = "C:\本地下载路径"

# 创建存储上下文
$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey

2. 分离原始Blob与标记Blob

我们需要把容器内的文件分成两类:原始业务文件,以及标记用的.succeeded文件:

# 获取容器内所有Blob
$allBlobs = Get-AzStorageBlob -Container $containerName -Context $storageContext

# 筛选出所有原始业务Blob(排除.succeeded结尾的标记文件)
$originalBlobs = $allBlobs | Where-Object { $_.Name -notlike "*.succeeded" }

# 提取已完成标记的原始文件名(去掉.succeeded后缀)
$completedFileNames = $allBlobs | Where-Object { $_.Name -like "*.succeeded" } | ForEach-Object {
    # 精准移除末尾的.succeeded后缀
    $_.Name -replace "\.succeeded$", ""
}

3. 筛选出需要下载的目标Blob

通过对比原始文件名和已完成标记的文件名,找出还未处理的文件:

# 只保留没有对应.succeeded标记的原始Blob
$blobsToDownload = $originalBlobs | Where-Object { $completedFileNames -notcontains $_.Name }

4. 执行下载与标记操作

遍历筛选后的Blob,完成下载后创建对应的0字节标记文件:

foreach ($blob in $blobsToDownload) {
    # 构建本地保存路径
    $localFilePath = Join-Path -Path $localDownloadFolder -ChildPath $blob.Name

    # 下载Blob到本地
    Get-AzStorageBlobContent -Blob $blob.Name -Container $containerName -Context $storageContext -Destination $localFilePath -Force

    # 创建对应的.succeeded标记文件(0字节)
    $markerBlobName = "$($blob.Name).succeeded"
    # 用内存流直接上传空文件,无需本地创建再上传
    $emptyStream = New-Object System.IO.MemoryStream
    Set-AzStorageBlobContent -Container $containerName -Context $storageContext -Blob $markerBlobName -Stream $emptyStream -Force
    $emptyStream.Dispose()

    Write-Host "已完成:$($blob.Name) 下载与标记"
}

Write-Host "所有待处理文件操作完成!"

踩坑提示

如果之前对比Blob时出现匹配错误,大概率是文件名匹配逻辑不够严谨:

  • 用-replace "\.succeeded$", ""可以精准匹配末尾的后缀,避免误匹配包含.succeeded字符的文件名
  • -notcontains是精确匹配,能避免大小写或者多余空格导致的匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:12:31