3个嵌套的foreach循环

时间:2018-04-26 22:02:02

标签: powershell

我尝试迁移某些虚拟机 - 我们没有在群集中设置DRS,我需要将其移动到3个特定主机和4个特定数据存储区。

如何运行仅采用第一个选项的嵌套foreach循环,将其他2个循环应用于第一个选项,然后继续循环。

例如,我有3个虚拟机,2个主机,2个数据存储。

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

所需的效果将是一个循环,需要" a",适用" 1"作为$ host," red"作为$ datastore。下一次迭代将采用" b",apply" 2"作为$ host," blue"作为$ datastore。下一次迭代将采用" c",apply" 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 :(得分:1)

您只需要一个foreach循环。在循环外部将变量$h$d初始化为零,然后在循环结束时递增它们,如果它们超出各自的范围,则重置为零。

如果$hosts$datastores的长度始终相同,则您甚至不需要两个变量,只需使用一个。

免费ProTip™:使用模运算符增加具有上边界的变量的简单方法是:

$h = ($h + 1) % $Hosts.Length

答案 1 :(得分:1)

以下代码应该可以执行您想要的操作而无需进行任何索引。如上所述,您只需要一个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"
}