PowerShell/CLI:"Foreach"多个阵列的循环



我有一个PowerCLI脚本,可以关闭虚拟机的电源,更改其内存和CPU,然后重新打开电源。我已经调整了脚本以利用变量。这一切都完美无缺。

我现在正在尝试修改脚本以利用数组,以便在大量 VM 中循环。关闭虚拟机电源和打开虚拟机电源的脚本部分可以完美运行。

我遇到的麻烦是在 foreach 循环中使用来自两个数组的变量。

对于 $vm_name 中的每个 VM,我需要设置 $memory_gb 中找到的相应内存量。

这就是我所拥有的(它当前为所有虚拟机设置了相同的内存量("1"(....

$vm_name = @("OMAC-SBXWIN7AJM", "OMAC-SBXWIN2012R2AJM", "OMAC-SBXWIN2008R2AJM")
$memory_gb = 2,4,4
# SET THE VM MEMORY
Write-Host 'NOW SETTING THE VM MEMORY'
foreach ($objItem in $vm_name)
{Set-VM -VM $vm_name -MemoryGB 1 -confirm:$false 
Break
}

https://i.stack.imgur.com/E9hfY.png

。我尝试在第一个循环中嵌套第二个 foreach 循环,但无济于事。

如何编写脚本,以便 $vm_name 中的每个 VM 获取在 $memory_gb 中找到的相应内存量?

您有 2 个选项。首先(不是我建议的(是一个 For(( 循环。它会是这样的:

For($I=0;$I -lt $vm_name.count;$I++){
    Set-VM -VM $vm_name[$I] -MemoryGB $memory_gb[$I] -confirm:$false
}

更好的方法是将其放入带有 VMName, Memory 等标头的 CSV 中,然后列出每个 VM 和所需的内存。然后运行类似这样的操作:

Import-CSV C:PathToFile.CSV | ForEach{Set-VM -VM $_.VMName -MemoryGB $_.memory -confirm:$false}

您可以使用 Zip 函数:

function Zip($a1, $a2) {
    while ($a1) {
        $x, $a1 = $a1
        $y, $a2 = $a2
        [tuple]::Create($x, $y)
    }
}

用法:

zip 'a','b','c' 1,2,3 |% {$_.item1 + $_.item2}

结果:

a1
b2
c3

另一个更紧凑的解决方案是使用哈希表:

$vms = @{"OMAC-SBXWIN7AJM" = 2; "OMAC-SBXWIN2012R2AJM" = 4; "OMAC-SBXWIN2008R2AJM" = 4}
# SET THE VM MEMORY
Write-Host 'NOW SETTING THE VM MEMORY'
foreach ($vm in $vms.getEnumerator()){
    Set-VM -VM $vm.Name -MemoryGB $vm.Value -confirm:$false 
}
$vm_name = @("OMAC-SBXWIN7AJM", "OMAC-SBXWIN2012R2AJM", "OMAC-
SBXWIN2008R2AJM")
$memory_gb = 2,4,4
# SET THE VM MEMORY
Write-Host 'NOW SETTING THE VM MEMORY'
foreach ($objItem in $vm_name)
{
    Set-VM -VM $vm_name -MemoryGB $memory_gb[$vm_name.indexOf($objItem)] -confirm:$false 
    Break
}

只要两个数组大小相同,这将起作用。

$vm_name = @("OMAC-SBXWIN7AJM", "OMAC-SBXWIN2012R2AJM", "OMAC-SBXWIN2008R2AJM")
$memory_gb = (2,4,4)
# SET THE VM MEMORY
Write-Host 'NOW SETTING THE VM MEMORY'
for( $i = 0; $i -lt $vm_name.length; $i++) {
  $vm = $vm_name[$i]
  $gb = $memory_gb[$i]
  write-host setting $vm to $gb GB ...
  Set-VM -VM $vm -MemoryGB $gb -confirm:$false 
}

您只需要确保两个数组的长度相同。

最新更新