我正在获取磁盘以及那些磁盘所连接的虚拟机名称,然后我想将磁盘名称和虚拟机名称保存为json变量。当我运行以下代码时,我没有得到所需的输出,有人可以帮助我提供正确的代码。
$disks=Get-AzDisk -ResourceGroupName MFA-RG | where {$_.ManagedBy -ne $null} | select name, managedby
$vmlist=foreach ($name in $disks){
$name.ManagedBy.Split('/')[8]
}
$vmname=foreach ($name in $disks){
$name.Name
}
$vmname=@{}
for($i=0; $i -lt $disks.count; $i++){
$vmname[$i] = $vmlist[$i] }
$vmname | ConvertTo-Json
我希望输出类似
{
"disk 1" : "VM1",
"disk 2" : "VM2"
}
答案 0 :(得分:3)
您即将完成自己想要的事情。不过,您需要进行一些修改:
$disks=Get-AzDisk -ResourceGroupName MFA-RG | where {$_.ManagedBy -ne $null} | select name, managedby
$vmlist=foreach ($name in $disks){
$name.ManagedBy.Split('/')[8]
}
$vmname=foreach ($name in $disks){
$name.Name
}
$HashOutput=[ordered]@{}
for($i=0; $i -lt $disks.count; $i++){
$HashOutput[$vmname[$i]] = $vmlist[$i] }
$HashOutput| ConvertTo-Json
您通过运行$vnname = @{}
初始化了一个新的哈希表。这会清除您先前存储在$vmname
中的所有内容。您可以只初始化一个新的哈希表,然后将$vmname
的索引值用作键。
您必须谨慎使用这种编码方式,因为如果磁盘数量为1,则访问$vmname[0]
和$vmlist[0]
只会导致这些字符串的第一个字符。这些变量将是[string]
类型,而不是[array]
类型。我建议针对这种情况进行编码。
说明:
[ordered]@{}
指示PowerShell使用顺序键创建新的哈希表对象。这意味着键/值对将按照它们添加到哈希表的顺序输出。
$HashOutput[$vmname[$i]]
将$i
评估为存储在变量中的当前整数值。在这种情况下,$vmname
通常是数组类型,这意味着它的值已被索引。由于$HashOutput
是哈希表,因此您可以使用$HashOutput["<key>"] = "<value>"
格式添加新的键/值对。在最终循环的第一次迭代中,$i
将为0。因此,$vmname[0]
将是该数组中的第一个元素。该元素将成为添加到哈希表的第一个键。 $vmlist[0]
将是添加到该键的相应值。