3 вложенных цикла foreach - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь перенести некоторые vms - у нас не настроен DRS в кластере, и мне нужно переместить его на 3 конкретных хоста и 4 конкретных хранилища данных.

Как я могу запустить вложенный цикл foreach, который принимает только 1-ую опцию, применяет другие 2 цикла к этой первой опции, а затем продолжает цикл.

например, у меня есть 3 виртуальных машины, 2 хоста, 2 хранилища данных.

$vms = a,b,c
$hosts = 1,2
$datastores = red, blue

Желаемым эффектом будет цикл, который принимает «a», применяет «1» в качестве $ host, «red» в качестве $ datastore. Следующая итерация будет принимать «b», применять «2» в качестве $ host, «blue» в качестве $ datastore. Следующая итерация будет принимать «c», применять «1» в качестве $ host, «red» в качестве $ datastore ....

мой код до сих пор:

foreach ($vm in $vms) {
for ($h = 0;$h -le 2; $h += 1) {
for ($d = 0;$d -le 2; $d += 1) {
write-output $vm;
write-output $vhosts[$h];
write-output $datastores[$d];
}}}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вот код, который должен делать то, что вы хотите, без необходимости индексирования. Как упоминалось выше, вам нужен только один цикл foreach. Этот код использует множественное присваивание для разделения различных списков, сбрасывая их к исходному значению, когда они пусты.

$vms = "a", "b", "c", "d", "e"
$hosts = 1,2
$datastores = "red", "blue", "green"

# Initialize the host and datastore lists
$hl = $dl = $null
foreach ($v in $vms)
{
    # if the host list is empty, reset it
    if (! $hl) { $hl = $hosts } 

    # extract the head and tail of the host list
    $h, $hl = $hl

    # If the data store list is empty, reinitialize it
    if (! $dl) { $dl = $datastores }

    # Extract the head and tail of the datastore list
    $d, $dl = $dl

    # Now do something with all three elements
    "vm $v host $h datastore $d"
}
0 голосов
/ 27 апреля 2018

Вам нужен только один foreach цикл. Инициализируйте переменные $h и $d равными нулю вне цикла, а затем увеличивайте их в конце цикла, сбрасывая их в ноль, если они находятся за пределами своих соответствующих диапазонов.

Если $hosts и $datastores всегда имеют одинаковую длину, вам даже не нужны две переменные, просто используйте одну.

Free ProTip ™: простой способ увеличить переменную с помощью верхней границы - использовать оператор по модулю:

$h = ($h + 1) % $Hosts.Length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...