在下面兩篇的基礎上修改了一點腳本,加入了統計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;
運行結果: