PowerShell/CLI: "Foreach" loop with multiple arrays

29,294

Solution 1

You have 2 options. First (and not what I would suggest) is a For() loop. It would go something like this:

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

The better way would be to put it in a CSV with headers like VMName, Memory and then list each VM and the memory you want in it. Then run something like:

Import-CSV C:\Path\To\File.CSV | ForEach{Set-VM -VM $_.VMName -MemoryGB $_.memory -confirm:$false}

Solution 2

You can use Zip function:

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

Usage:

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

Result:

a1
b2
c3

Solution 3

Another, more compact, solution is to use a hashtable:

$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 
}

Solution 4

$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
}

This will work as long as the two arrays are the same size.

Solution 5

$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 
}

You just need to ensure both arrays are of the same length.

Share:
29,294
James McCallister
Author by

James McCallister

Updated on July 09, 2022

Comments

  • James McCallister
    James McCallister almost 2 years

    I have a PowerCLI script that powers off a VM, changes its memory and cpu, and then powers it back on. I've adapted the script to utilize variables. This all works perfectly.

    I'm now trying to modify the script to utilize arrays, in order to cycle through numerous VMs. The script portions that powers off and powers on the VMs works perfectly.

    The trouble I'm having is using variables from two arrays in a foreach loop.

    For each VM in $vm_name, I need to set the corresponding amount of memory found in $memory_gb.

    This is what I have (it currently sets the same amount of memory ("1") for all of the VMs)....

    $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

    ...I've tried nesting a second foreach loop inside of the first, to no avail.

    How do write the script so each VM in $vm_name, gets the corresponding amount of memory found in $memory_gb?