我尝试迁移某些虚拟机 - 我们没有在群集中设置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];
}}}
答案 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"
}