[英]PowerShell/CLI: “Foreach” loop with multiple arrays
我有一个PowerCLI脚本,可以关闭VM,更改其内存和CPU,然后重新启动它。 我已经改编了脚本以利用变量。 一切都很完美。
我现在正在尝试修改脚本以利用数组,以便循环遍历众多虚拟机。 关闭和启动VM的脚本部分可以很好地工作。
我遇到的麻烦是在foreach循环中使用来自两个数组的变量。
对于$ vm_name中的每个VM,我需要设置$ memory_gb中找到的相应内存量。
这就是我所拥有的(它目前为所有VM设置相同数量的内存(“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
}
http://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:\Path\To\File.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
$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
}
您只需要确保两个数组的长度相同。
另一个更紧凑的解决方案是使用哈希表:
$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
}
只要两个数组的大小相同,这将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.