用于在 Azure 中列出非托管磁盘的 Foreach 循环

Posted

技术标签:

【中文标题】用于在 Azure 中列出非托管磁盘的 Foreach 循环【英文标题】:Foreach loop for listing unmanaged disks in Azure 【发布时间】:2019-09-08 15:28:53 【问题描述】:

在 PS 中列出 azure 托管磁盘非常容易,但列出非托管磁盘非常棘手,因为它们不是 azure POV 中的对象。我尝试编写 foreach 循环来列出每个存储帐户的所有未管理磁盘(即 *.vhd 文件)。这是我写的代码:

$StorageAccounts = Get-AzureRmStorageAccount
$sa = $StorageAccounts | foreach-object 

#Get the Management key for the storage account
$key1 = (Get-AzureRmStorageAccountKey -ResourceGroupName $_.ResourceGroupName -name $_.StorageAccountName)[0].value
 
#Get the Storage Context to access the Storage Container
$storageContext = New-AzureStorageContext -StorageAccountName $_.StorageAccountName -StorageAccountKey $key1
 
#Get the Storage Container in the Variable
$storageContainer = Get-AzureStorageContainer -Context $storageContext

$blob = Get-AzureStorageBlob -Container $storageContainer.name -Context $storageContext 

 [PSCustomObject]@
 "Name" = $blob.Name
 "Length" = $blob.Length
 "Storage Account Name" = $_.StorageAccountName


我希望循环获取每个 storageaccount 的所有 vhd 并将其解析为 pscustomobject 以列出所有存储帐户中的所有 vhd*s,但我收到错误:

Get-AzureStorageBlob:无法验证参数上的参数 '容器'。参数为 null 或空。提供一个论据 不为 null 或为空,然后重试该命令。在线:13 字符:41

Get-AzureStorageBlob:无法将“System.Object[]”转换为类型 参数“Container”需要“System.String”。 > 不支持指定的方法。 在 line:13 char:41

为什么循环没有在第 11 行将数据解析到 $storageContainer?我可以看到其他两个变量(如 $key1 和 $storageContext)里面的内容。

【问题讨论】:

因为 $storageContainer.name 将返回一个数组,因为许多容器可以在一个存储帐户中。 那么您的建议是,Get-AzureStorageBlob cmdlet 的另一个循环?但是这个循环应该是什么样子,所以它可以将数据解析为表变量? 是的,再写一个循环,我认为下面的答案应该可以。 【参考方案1】:

你可以用这种方式重写你的脚本:

$StorageAccounts = Get-AzureRmStorageAccount
$StorageAccounts.foreach
    $ctx = $_.Context
    $containers = Get-AzureStorageContainer -Context $ctx
    $containers.foreach
        $blobs = Get-AzureStorageBlob -Container $_.name -Context $ctx
        $blobs.foreach
            do_something
        
    

您不需要获取密钥来构造上下文,因为存储帐户变量包含上下文。然后你需要迭代容器和blob

【讨论】:

以上是关于用于在 Azure 中列出非托管磁盘的 Foreach 循环的主要内容,如果未能解决你的问题,请参考以下文章

Azure Powershell使用已有Image创建ARM非托管磁盘虚拟机

42.从非托管磁盘创建虚拟机

在Azure中创建虚机映像

Azure:在为 azure 创建新的联合国托管磁盘时无法指定存储帐户。

azure-sdk-for-python:获取指定资源组的托管磁盘列表

如何将 Azure 托管磁盘克隆到不同的订阅中?