如何在Powershell中循环遍历2个数组?

时间:2019-03-23 18:44:08

标签: azure powershell

我正在获取磁盘以及那些磁盘所连接的虚拟机名称,然后我想将磁盘名称和虚拟机名称保存为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"
}

1 个答案:

答案 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]将是添加到该键的相应值。