I was working on a PVS deployment recently and needed to quickly add some RAM to ~200 PVS streamed VMs. To automate this task, I put together the following PoSH script that combines PowerCLI and the XenDesktop PoSH SDK to add RAM to all machines in a particular desktop group:
################################################################### # # Change-VM_Memory_CPU_Count.ps1 # # -MemoryMB the amount of Memory you want # to add or remove from the VM in MB # -MemoryOption Add/Remove # -CPUCount the amount of vCPU's you want # to add or remove from the VM # -CPUOption Add/Remove # -DesktopGroup the XenDesktop Desktop Group to run against # -AdminAddress host name of the XenDesktop DDC to run against # # Example: # .\Change-VM_Memory_CPU_Count.ps1 -vCenter vmvcatl05 -MemoryMB 1024 -MemoryOption Add -DesktopGroup 'All User Windows 7' -AdminAddress CTXXDATL01 # # #################################################################### param( [parameter(Mandatory = $true)] [string[]]$vCenter, [int]$MemoryMB, [string]$MemoryOption, [int]$CPUCount, [string]$CPUOption, [string]$DesktopGroup, [string]$AdminAddress ) function PowerOff-VM{ param([string] $vm) Shutdown-VMGuest -VM (Get-VM $vm) -Confirm:$false | Out-Null Write-Host "Shutdown $vm" do { $status = (get-VM $vm).PowerState }until($status -eq "PoweredOff") return "OK" } function PowerOn-VM{ param( [string] $vm) if($vm -eq ""){ Write-Host "Please enter a valild VM name"} if((Get-VM $vm).powerstate -eq "PoweredOn"){ Write-Host "$vm is already powered on"} else{ Start-VM -VM (Get-VM $vm) -Confirm:$false | Out-Null Write-Host "Starting $vm" do { $status = (Get-vm $vm | Get-View).Guest.ToolsRunningStatus }until($status -eq "guestToolsRunning") return "OK" } } function Change-VMMemory{ param([string]$vmName, [int]$MemoryMB, [string]$Option) if($vmName -eq ""){ Write-Host "Please enter a VM Name" return } if($MemoryMB -eq ""){ Write-Host "Please enter an amount of Memory in MB" return } if($Option -eq ""){ Write-Host "Please enter an option to add or remove memory" return } $vm = Get-VM $vmName $CurMemoryMB = ($vm).MemoryMB if($vm.Powerstate -eq "PoweredOn"){ Write-Host "The VM must be Powered Off to continue" return } if($Option -eq "Add"){ $NewMemoryMB = $CurMemoryMB + $MemoryMB } elseif($Option -eq "Remove"){ if($MemoryMB -ge $CurMemoryMB){ Write-Host "The amount of memory entered is greater or equal than the current amount of memory allocated to this VM" return } $NewMemoryMB = $CurMemoryMB - $MemoryMB } $vm | Set-VM -MemoryMB $NewMemoryMB -Confirm:$false Write-Host "The new configured amount of memory is"(Get-VM $VM).MemoryMB } function Change-VMCPUCount{ param([string]$vmName, [int]$NumCPU, [string]$Option) if($vmName -eq ""){ Write-Host "Please enter a VM Name" return } if($NumCPU -eq ""){ Write-Host "Please enter the number of vCPU's you want to add" return } if($Option -eq ""){ Write-Host "Please enter an option to add or remove vCPU" return } $vm = Get-VM $vmName $CurCPUCount = ($vm).NumCPU if($vm.Powerstate -eq "PoweredOn"){ Write-Host "The VM must be Powered Off to continue" return } if($Option -eq "Add"){ $NewvCPUCount = $CurCPUCount + $NumCPU } elseif($Option -eq "Remove"){ if($NumCPU -ge $CurCPUCount){ Write-Host "The number of vCPU's entered is higher or equal than the current number of vCPU's allocated to this VM" return } $NewvCPUCount = $CurCPUCount - $NumCPU } $vm | Set-VM -NumCPU $NewvCPUCount -Confirm:$false Write-Host "The new configured number of vCPU's is"(Get-VM $VM).NumCPU } ####################################################################################### # Main script ####################################################################################### $VIServer = Connect-VIServer $vCenter If ($VIServer.IsConnected -ne $true){ Write-Host "error connecting to $vCenter" -ForegroundColor Red exit } if($MemoryMB -or $CPUCount -ne "0"){ foreach ($vm in get-brokerdesktop -DesktopGroupName $DesktopGroup -AdminAddress $AdminAddress -PowerState Off) { $vmwvm = Get-VM -Name $vm.HostedMachineName if ($vmwvm.MemoryMB -lt 4000) { if($MemoryMB -ne "0"){ if($MemoryOption -eq " ") {Write-Host "Please enter an option to add or remove memory"} else { Change-VMMemory $vm.HostedMachineName $MemoryMB $MemoryOption } } } if($CPUCount -ne "0"){ if($CPUOption -eq " ") {Write-Host "Please enter an option to add or remove cpu"} else{ Change-VMCPUCount $vmName $CPUCount $CPUOption } } } } Disconnect-VIServer -Confirm:$false
Does this work in PVS 7.6 for VMs that are deployed through XenDesktop 7.5? Will we need to schedule downtime (i.e. – this process shuts down the VMs)?