Search code examples
powershellazure-storage-account

Cannot update ContinuationToken variable with actual ContinuationToken


I'm trying to run this code to scan a larger Azure Storage Account based on a filter string. But I get this error:

An error occurred: Cannot convert 'System.Object[]' to the type 'Microsoft.Azure.Storage.Blob.BlobContinuationToken' required by parameter 'ContinuationToken'. Specified method is not supported.

As I am already initializing $BlobContinuationToken as Microsoft.Azure.Storage.Blob.BlobContinuationToken, I'm not understanding the given error here. Can anyone explain?

$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"

# Get the storage account context
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName
$ctx = $storageAccount.Context

$continuationToken = New-Object -TypeName 'Microsoft.WindowsAzure.Storage.Blob.BlobContinuationToken'
$continuationToken = $null
$filterCriteria = "*your-filter-criteria*"  # Example filter criteria
#$minSize = 100MB  # Example size filter

do {
    try {
        $resultSegment = Get-AzStorageBlob -Container $containerName -Context $ctx -ContinuationToken $continuationToken -MaxCount 500
        $blobs = $resultSegment.Results
        $continuationToken = $resultSegment.ContinuationToken

        # Filter blobs based on criteria
        $filteredBlobs = $blobs | Where-Object { $_.Name -like $filterCriteria  } #-and $_.Length -gt $minSize

        # Process the filtered blobs
        $filteredBlobs | ForEach-Object { $_.Name }
    }
    catch {
        Write-Error "An error occurred: $_"
        # Optionally, implement a retry mechanism or log the error for further investigation
        Start-Sleep -Seconds 5  # Wait for a few seconds before retrying
    }
} while ($continuationToken -ne $null)


Solution

  • From example 4 in the docs, it seems you need to get the continuation token from the last item returned by Get-AzStorageBlob. The error message also shows it is now receiving a System.Object[] (an array) instead of a single value, so you might try:

    $continuationToken = @($resultSegment)[-1].ContinuationToken
    

    By surrounding $resultSegment with @() you force it to be an array even if there is only one element. By doing this, you can safely index the last item using [-1]

    B.T.W. You can remove the line $continuationToken = New-Object -TypeName 'Microsoft.WindowsAzure.Storage.Blob.BlobContinuationToken' $continuationToken = $null