Как перебрать 2 массива в powershell? - PullRequest
1 голос
/ 23 марта 2019

Я извлекаю диски вместе с именами виртуальных машин, к которым эти диски подключены, затем я хочу сохранить имя диска и имя виртуальной машины в переменной как 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 Ответ

3 голосов
/ 23 марта 2019

Вы очень близки к выполнению того, что вы хотите.Вам нужно сделать несколько правок:

$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] будет соответствующим значением, добавленным к этому ключу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...