Azure存储Blob扫描时ContinuationToken类型转换错误求助
Azure存储Blob扫描时ContinuationToken类型转换错误的解决方法
错误原因
- 类型不兼容:你手动初始化的
Microsoft.WindowsAzure.Storage.Blob.BlobContinuationToken属于旧AzureRM模块类型,而Az模块的Get-AzStorageBlob要求的是Microsoft.Azure.Storage.Blob.BlobContinuationToken类型,两者无法互相转换。 - 模块冲突:如果环境中同时安装了AzureRM和Az模块,会导致类型解析混乱,使得
$resultSegment.ContinuationToken被错误识别为System.Object[]数组,触发类型转换错误。 - 冗余代码干扰:你先创建旧类型实例又立即设为
null的操作完全多余,反而可能干扰PowerShell的类型解析逻辑。
修复方案
- 移除冗余初始化代码:首次调用
Get-AzStorageBlob时直接传入null即可,无需手动创建ContinuationToken实例。 - 清理模块环境:卸载AzureRM模块(若存在),确保仅使用Az模块,避免类型冲突。
- 直接复用返回的Token:循环中直接赋值
$resultSegment.ContinuationToken,它会自动是Az模块要求的正确类型。
修正后的代码
$SubscriptionName = 'not-going-to-tell-you' Select-AzSubscription -SubscriptionName $SubscriptionName $resourceGroupName = "rg-not-going-to-tell-you" $storageAccountName = "stnot-going-to-tell-you" $containerName = "not-going-to-tell-you" # 获取存储账户上下文 $storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName $ctx = $storageAccount.Context $continuationToken = $null $filterCriteria = "*your-filter-criteria*" # 示例过滤规则 #$minSize = 100MB # 示例大小过滤规则 do { try { $resultSegment = Get-AzStorageBlob -Container $containerName -Context $ctx -ContinuationToken $continuationToken -MaxCount 500 $blobs = $resultSegment.Results $continuationToken = $resultSegment.ContinuationToken # 根据规则过滤Blob $filteredBlobs = $blobs | Where-Object { $_.Name -like $filterCriteria } #-and $_.Length -gt $minSize # 处理过滤后的Blob $filteredBlobs | ForEach-Object { $_.Name } } catch { Write-Error "发生错误: $_" Start-Sleep -Seconds 5 # 重试前等待5秒 } } while ($continuationToken -ne $null)
内容的提问来源于stack exchange,提问作者MrSiezen
相关产品推荐
相关产品推荐

