【问题标题】:How to get size of Azure Container in PowerShell如何在 PowerShell 中获取 Azure 容器的大小
【发布时间】:2016-07-09 19:33:46
【问题描述】:

类似于这个问题How to get size of Azure CloudBlobContainer

如何在 PowerShell 中获取 Azure 容器的大小。我可以在 https://gallery.technet.microsoft.com/scriptcenter/Get-Billable-Size-of-32175802 看到建议的脚本,但想知道在 PowerShell 中是否有更简单的方法

【问题讨论】:

    标签: azure azure-blob-storage azure-powershell


    【解决方案1】:

    使用 Azure PowerShell,您可以使用 Get-AzureStorageBlob 列出容器中的所有 blob,容器和上下文参数如下:

    $ctx = New-AzureStorageContext -StorageAccountName youraccountname -storageAccountKey youraccountkey
    
    $blobs = Get-AzureStorageBlob -Container containername -Context $ctx
    

    Get-AzureStorageBlob的输出是一个AzureStorageBlob的数组,它有一个名为ICloudBlob的属性,你可以在它的Properties中得到blob长度,然后你可以将所有blob的长度相加得到内容长度容器。

    【讨论】:

    • 一点警告:如果 blob 容器太大,使用此代码最终会得到 OutOfMemoryException。您可以通过实现 MaxCount 和 ContinuationToken 来批量检索 blob 来解决此问题
    【解决方案2】:

    以下 PowerShell 脚本是问题 How to get size of Azure CloudBlobContainer 的已接受答案中 c# 代码的简单翻译。希望这能满足您的需求。

    Login-AzureRmAccount
    $accountName = "<your storage account name>"
    $keyValue = "<your storage account key>"
    $containerName = "<your container name>"
    
    $storageCred = New-Object Microsoft.WindowsAzure.Storage.Auth.StorageCredentials ($accountName, $keyValue)
    
    $storageAccount = New-Object Microsoft.WindowsAzure.Storage.CloudStorageAccount ($storageCred, $true)
    
    $container = $storageAccount.CreateCloudBlobClient().GetContainerReference($containerName)
    
    $length = 0
    
    $blobs = $container.ListBlobs($null, $true, [Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails]::None, $null, $null)
    
    $blobs | ForEach-Object {$length = $length + $_.Properties.Length}
    
    $length
    

    注意:前面的Login-AzureRmAccount 命令将为您加载必要的.dll。如果您确实知道“Microsoft.WindowsAzure.Storage.dll”的路径,您可以将其替换为[Reflection.Assembly]::LoadFile("$StorageLibraryPath") | Out-Null。路径通常是这样的“C:\Program Files\Microsoft SDKs\Azure.NET SDK\v2.7\ToolsRef\Microsoft.WindowsAzure.Storage.dll”

    【讨论】:

    • 感谢您提供了一个好主意。我通过使用存储帐户密钥和上下文避免了 Login-AzureRmAccount
    • Login-AzureRmAccount 根本不用于登录。它用于加载库。如果您知道 .dll 文件的路径,则没有必要。 @EmmaZhu-MSFT 的回答很棒。她正在使用纯 PowerShell 命令。而且,我的回答是,如果你得到一段 C# 代码,你总是可以将它翻译成 PowerShell 脚本。解决问题的另一种方法。
    • 我想为你的答案投票,但我还没有足够的分数来做这件事:)
    • 没问题。 @EmmaZhu-MSFT 的回答已被接受。她的回答也很棒。
    【解决方案3】:

    这是我今天刚刚敲定的解决方案。上面的例子并没有给我我想要的,即(1)容器中所有 blob 的字节总和和(2)每个 blob + 路径 + 大小的列表,以便它可以用来将结果与 du 进行比较-b 在 linux 上(起源)。

    Login-AzureRmAccount
    $ResourceGroupName = ""
    $StorageAccountName = ""
    $StorageAccountKey = ""
    $ContainerName = "" 
    
    New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
    # Don't NEED the Resource Group but, without it, fills the screen with red as it search each RG...
    $size = 0
    $blobs = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName -ErrorAction Ignore | Get-AzureStorageBlob -Container $ContainerName
    foreach ($blob in $blobs) {$size = $size + $blob.length}
    write-host "The container is $size bytes."
    $properties = @{Expression={$_.Name};Label="Name";width=180}, @{Expression={$_.Length};Label="Bytes";width=80}
    $blobs | ft $properties | Out-String -width 800 | Out-File -Encoding ASCII AzureBlob_files.txt
    

    然后我将文件移动到 Linux 以对其进行一些翻转,并查找输出以创建要输入到 blobxfer 的文件列表。不同问题的解决方案,但也可能是满足您需求的合适解决方案。

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多