arrays - examples - PowerShell/CLI: bucle "Foreach" con matrices mĂșltiples
powershell get childitem foreach (5)
Tengo un script de PowerCLI que apaga una VM, cambia su memoria y CPU, y luego la vuelve a encender. He adaptado el script para utilizar variables. Todo esto funciona perfectamente.
Ahora estoy tratando de modificar la secuencia de comandos para utilizar matrices, con el fin de recorrer numerosas máquinas virtuales. Las porciones de script que se apagan y encienden las máquinas virtuales funcionan perfectamente.
El problema que estoy teniendo es usar variables de dos matrices en un ciclo foreach.
Para cada máquina virtual en $ nombre_vm, necesito establecer la cantidad correspondiente de memoria encontrada en $ memory_gb.
Esto es lo que tengo (actualmente establece la misma cantidad de memoria ("1") para todas las máquinas virtuales) ....
$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
... Intenté anidar un segundo ciclo foreach dentro del primero, sin éxito.
¿Cómo se escribe la secuencia de comandos para que cada máquina virtual en $ nombre_vm obtenga la cantidad de memoria correspondiente en $ memory_gb?
Otra solución más compacta es usar una tabla hash:
$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
}
Tienes 2 opciones. Primero (y no lo que yo sugeriría) es un ciclo For (). Sería algo como esto:
For($I=0;$I -lt $vm_name.count;$I++){
Set-VM -VM $vm_name[$I] -MemoryGB $memory_gb[$I] -confirm:$false
}
La mejor forma sería colocarlo en un CSV con encabezados como VMName, Memory
y luego enumerar cada VM y la memoria que desee en él. Luego ejecuta algo como:
Import-CSV C:/Path/To/File.CSV | ForEach{Set-VM -VM $_.VMName -MemoryGB $_.memory -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''
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
}
Solo necesita asegurarse de que ambas matrices tengan la misma longitud.
Puede usar la función Zip:
function Zip($a1, $a2) {
while ($a1) {
$x, $a1 = $a1
$y, $a2 = $a2
[tuple]::Create($x, $y)
}
}
Uso:
zip ''a'',''b'',''c'' 1,2,3 |% {$_.item1 + $_.item2}
Resultado:
a1
b2
c3
Sé que esta es una publicación anterior, pero ¿qué pasa con esto?
$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
}
Esto funcionará siempre que las dos matrices tengan el mismo tamaño.