用于在 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非托管磁盘虚拟机
Azure:在为 azure 创建新的联合国托管磁盘时无法指定存储帐户。