[Azure]使用Powershell獲取ASM和ARM存儲的實際使用量

在下面兩篇的基礎上修改了一點腳本,加入了統計Blob實際大小的部分:

http://blog.csdn.net/qwertyupoiuytr/article/details/77527998

http://blog.csdn.net/qwertyupoiuytr/article/details/77527951


針對ASM下存儲賬號的腳本:

param(  
    [Parameter(Mandatory = $true)]
    [string]$SubscriptionName,
   
    [Parameter(Mandatory = $true)]
    [string]$StorageAccountName
)

Function GetBlobBytes($blob)
{
    $blobSizeInBytes = 124 + $blob.Name.Length * 2;
    $metadataEnumerator = $blob.ICloudBlob.Metadata.GetEnumerator();
    while ($metadataEnumerator.MoveNext())
    {
        $blobSizeInBytes += 3 + $metadataEnumerator.Current.Key.Length + $metadataEnumerator.Current.Value.Length;
    }


    if ($blob.BlobType.ToString() -eq "BlockBlob")
    {
        $blobSizeInBytes += 8;
        $blob.ICloudBlob.DownloadBlockList() | ForEach-Object { $blobSizeInBytes += $_.Length + $_.Name.Length; }
    }
    else
    {
        [int64]$rangeSize = 1GB;
        [int64]$start = 0; $pages = "start";
        while ($pages)
        {
            try
            {
                $pages = $blob.ICloudBlob.GetPageRanges($start, $rangeSize);
            }
            catch
            {
                if ($_ -like "*the range specified is invalid*")
                {
                    $pages = $null;
                    break;
                }
                else
                {
                    Write-Error $_;
                }
            }
            $pages | ForEach-Object { $blobSizeInBytes += 12 + $_.EndOffset - $_.StartOffset; }
            $start += $rangeSize;
        }
    }

    return $blobSizeInBytes;
}

Function SummarizeContainer($context, $containerName)
{
    Write-Host ("Calculating container {0}" -f $containerName) -ForegroundColor Yellow;
    $totalCount = 0;
    $totalSize = 0;
    $actualSize = 0;
    $token = $null;
    $tokenStep = 5000;
    do
    {
        $blobs = Get-AzureStorageBlob -Container $containerName -Context $context -ContinuationToken $token -MaxCount $tokenStep;
        if($blobs.Length -le 0) 
        { 
            break;
        }
        foreach($blob in $blobs)
        {
            $totalSize += $blob.Length;
            $actualSize += GetBlobBytes $blob;
        }
        $totalCount += $blobs.Count;
        Write-Host ("{0} blobs calculated" -f $totalCount) -ForegroundColor Cyan;
        $token = $blobs[$blobs.Count -1].ContinuationToken;
    }
    while($token -ne $null)

    $totalSizeStr = DecorateSizeWithUnit $totalSize;
    $actualSizeStr = DecorateSizeWithUnit $actualSize;

    return [PSCustomObject]@{ContainerName = $containerName
                             BlobCount = $totalCount
                             TotalSize = $totalSizeStr
                             ActualTotalSize = $actualSizeStr};
}

Function DecorateSizeWithUnit($totalSize)
{
    $totalSizeStr = "";
    if (($totalSize/1024/1024/1024) -gt 1)
    {
        $totalSizeStr = "{0:N}GB" -f ($totalSize/1024/1024/1024);
    }
    elseif (($totalSize/1024/1024) -gt 1)
    {
        $totalSizeStr = "{0:N}MB" -f ($totalSize/1024/1024);
    }
    elseif (($totalSize/1024) -gt 1)
    {
        $totalSizeStr = "{0:N}KB" -f ($totalSize/1024);
    }
    else
    {
        $totalSizeStr = "{0:N}Byte" -f $totalSize;
    }
    return $totalSizeStr;
}

[void](Select-AzureSubscription -SubscriptionName $SubscriptionName);
$storage = Get-AzureStorageAccount -StorageAccountName $StorageAccountName;
$context = $storage.Context;

Write-Host "Collecting containers" -ForegroundColor Yellow;
$containers = Get-AzureStorageContainer -Context $context;

$containerSummary = @();
foreach ($container in $containers)
{
    $containerSummary += (SummarizeContainer $context $container.Name);
}

$containerSummary | Select ContainerName, BlobCount, TotalSize, ActualTotalSize;

運行結果:



針對ARM模式下存儲賬號的腳本:

param(  
    [Parameter(Mandatory = $true)]
    [string]$SubscriptionName,
   
    [Parameter(Mandatory = $true)]
    [string]$ResourceGroupName,
   
    [Parameter(Mandatory = $true)]
    [string]$StorageAccountName
)

Function GetBlobBytes($blob)
{
    $blobSizeInBytes = 124 + $blob.Name.Length * 2;
    $metadataEnumerator = $blob.ICloudBlob.Metadata.GetEnumerator();
    while ($metadataEnumerator.MoveNext())
    {
        $blobSizeInBytes += 3 + $metadataEnumerator.Current.Key.Length + $metadataEnumerator.Current.Value.Length;
    }


    if ($blob.BlobType.ToString() -eq "BlockBlob")
    {
        $blobSizeInBytes += 8;
        $blob.ICloudBlob.DownloadBlockList() | ForEach-Object { $blobSizeInBytes += $_.Length + $_.Name.Length; }
    }
    else
    {
        [int64]$rangeSize = 1GB;
        [int64]$start = 0; $pages = "start";
        while ($pages)
        {
            try
            {
                $pages = $blob.ICloudBlob.GetPageRanges($start, $rangeSize);
            }
            catch
            {
                if ($_ -like "*the range specified is invalid*")
                {
                    $pages = $null;
                    break;
                }
                else
                {
                    Write-Error $_;
                }
            }
            $pages | ForEach-Object { $blobSizeInBytes += 12 + $_.EndOffset - $_.StartOffset; }
            $start += $rangeSize;
        }
    }

    return $blobSizeInBytes;
}

Function SummarizeContainer($context, $containerName)
{
    Write-Host ("Calculating container {0}" -f $containerName) -ForegroundColor Yellow;
    $totalCount = 0;
    $totalSize = 0;
    $actualSize = 0;
    $token = $null;
    $tokenStep = 5000;
    do
    {
        $blobs = Get-AzureStorageBlob -Container $containerName -Context $context -ContinuationToken $token -MaxCount $tokenStep;
        if($blobs.Length -le 0) 
        { 
            break;
        }
        foreach($blob in $blobs)
        {
            $totalSize += $blob.Length;
            $actualSize += GetBlobBytes $blob;
        }
        $totalCount += $blobs.Count;
        Write-Host ("{0} blobs calculated" -f $totalCount) -ForegroundColor Cyan;
        $token = $blobs[$blobs.Count -1].ContinuationToken;
    }
    while($token -ne $null)

    $totalSizeStr = DecorateSizeWithUnit $totalSize;
    $actualSizeStr = DecorateSizeWithUnit $actualSize;

    return [PSCustomObject]@{ContainerName = $containerName
                             BlobCount = $totalCount
                             TotalSize = $totalSizeStr
                             ActualTotalSize = $actualSizeStr};
}

Function DecorateSizeWithUnit($totalSize)
{
    $totalSizeStr = "";
    if (($totalSize/1024/1024/1024) -gt 1)
    {
        $totalSizeStr = "{0:N}GB" -f ($totalSize/1024/1024/1024);
    }
    elseif (($totalSize/1024/1024) -gt 1)
    {
        $totalSizeStr = "{0:N}MB" -f ($totalSize/1024/1024);
    }
    elseif (($totalSize/1024) -gt 1)
    {
        $totalSizeStr = "{0:N}KB" -f ($totalSize/1024);
    }
    else
    {
        $totalSizeStr = "{0:N}Byte" -f $totalSize;
    }
    return $totalSizeStr;
}

[void](Select-AzureRmSubscription -SubscriptionName $SubscriptionName);
$storage = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName;
$context = $storage.Context;

Write-Host "Collecting containers" -ForegroundColor Yellow;
$containers = Get-AzureStorageContainer -Context $context;

$containerSummary = @();
foreach ($container in $containers)
{
    $containerSummary += (SummarizeContainer $context $container.Name);
}

$containerSummary | Select ContainerName, BlobCount, TotalSize, ActualTotalSize;

運行結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章