Start-Job封装带分页的Get-AzStorageBlob查询仅返回部分结果如何解决
根因分析
你遇到的问题本质是Start-Job启动的独立后台进程中,Azure存储返回的BlobContinuationToken复杂类型在对象序列化过程中丢失了类型信息,导致Get-AzStorageBlob无法识别后续迭代传入的延续令牌,误判为没有更多结果,循环提前终止,最终仅返回257条数据。
解决方案
调整作业内的逻辑,优化延续令牌的判断和保存时机,具体修改点如下:
- 将集合判空逻辑从
$Blobs.Length -le 0改为$null -eq $Blobs -or $Blobs.Count -le 0,兼容单Blob对象场景下Length属性不存在导致的误判 - 先提取并校验延续令牌再输出Blob集合,避免管道枚举过程中Blob对象的属性被修改导致令牌丢失
- 额外校验延续令牌的
NextMarker属性,确认真实存在待返回的后续数据
修改后的可用代码如下:
# 用Start-Job规避模块依赖冲突 Start-Job -ScriptBlock { # 若存在多版本Az.Storage模块,可显式指定加载版本,避免版本不一致问题 # Import-Module Az.Storage -RequiredVersion <你使用的模块版本号> -Force $storageContainer = New-AzStorageContext -ConnectionString $using:StorageAccountConnectionString ` | Get-AzStorageContainer -Name $using:BlobContainerName; $MaxCount = 100; $Token = $Null; do { $Blobs = $storageContainer | Get-AzStorageBlob ` -MaxCount $MaxCount ` -ContinuationToken $Token; if($null -eq $Blobs -or $Blobs.Count -le 0) { Break; } # 先保存延续令牌再输出Blob,避免管道枚举导致令牌属性丢失 $rawToken = $Blobs[$Blobs.Count - 1].ContinuationToken; # PowerShell 7+支持三元运算符,低版本可替换为常规if判断 $Token = ($rawToken -and $rawToken.NextMarker) ? $rawToken : $null; $Blobs; } While ($null -ne $Token) } | Receive-Job -Wait -Force;
内容的提问来源于stack exchange,提问作者Shaun Luttin
相关产品推荐
相关产品推荐

