Hiiiiiiii
Please visit my site on the following URL
https://www.powershellcenter.com
#Exchange #PowerShell #Active Directory #Microsoft #Daily Problems.. Online Help
Join me :)
Facebook: Facebook Page, You will like it :)
Looking for PowerShell Command Help, Go here www.powershellcenter.com
Got a question, feel free and contact me farisnt on the Gmail email server :)
Hiiiiiiii
Please visit my site on the following URL
https://www.powershellcenter.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | <# .Description Function To Move VMs From 1 host to other It Depend on the host Memory availibilty .Example Set-AutoEMM.ps1 -FromVMHostName MyVMHostServer -MaxMemAllowed 80 -FromCluster Production -FromVMHostName: The Source VMHost Server -MaxMemAllowed: Percentage of memory limit, default is 80, if the server memory load is 80% or more VMs wont be moved to this server and the script will search for another server to move the VM to if there is no more available server with less than 80% or the required value, the script will stop and show an error indicating the failure. -FromCluster: Cluster name where the hosts are exist This Script is for free you can update and use it as you want, Please add your name under the contributor Created By: -Faris Malaeb Contributor #Requires -Modules VMware.VimAutomation.Core #> param ( [parameter(mandatory = $True)] $FromVMHostName , [parameter(mandatory = $False)] [int]$MaxMemAllowed = "80", [parameter(mandatory = $True)] $vCenter , [parameter(mandatory = $True)] $FromCluster ) ################# General Variables $Finalresult=@() [bool]$ErrorFlag=$False ########## ########## Required module Import-Module VMware.VimAutomation.Core ############### Function Get-MostFreeServer ($NeededMemorySizeinGB) { #Below I will get the list of VMHost which are applicable for migration which include the following filter #Excluding the Move From Server #Server with a proper state # Have enough memory that match the user input parameter $CurrentServersLoad=Get-VMHost | where{ ($_.name -notlike $FromVMHostName) -and ($_.ConnectionState -notlike "*main*") -and ($_.ConnectionState -notlike "NotResponding") -and ($_.ConnectionState -notlike "Unknown") -and ((($_.MemoryUsageGB + $NeededMemorySizeinGB)/$_.MemoryTotalGB * 100) -lt $MaxMemAllowed) } | Sort-Object MemoryUsageGB if (($CurrentServersLoad).count -lt 1){ Write-Host "I am sorry, but there is no space for any migration..." # No Server available to hold the migration return "PS_FAIL_No_Resource" } Else{ #Yes there are at least one server that is good to host the VM Migration. return $CurrentServersLoad[0].Name } } #Checking the MaxMemAllowed User input to make sure that the user type a proper value Write-Host "Validating the input" -ForegroundColor Yellow if (($MaxMemAllowed -le 5) -or ($MaxMemAllowed -gt 99)){ Write-Host "I am sorry, but it seems that the MaxMemAllowed is not correct" -ForegroundColor Red Write-Host "The MaxMemAllowed cannot be as "$MaxMemAllowed -ForegroundColor Red break } Try { if ($global:DefaultVIServer.count -eq 0) { #If No Connection to VC found then the script will start a new connection, otherwise the -vCenter Parameter is ignored write-host "Please Connect to vCenter using Connect-VIServer first" -ForegroundColor Yellow $VC = Get-Credential -Message "Please type the username and password for vCenter" -ea Stop -UserName "administrator@vsphere.local" if ($VC -eq $null) { Write-Host -ForegroundColor Red "User press Cancel, I am leaving ..."; exit } Connect-VIServer -Credential $VC -Server $vCenter -ErrorAction Stop } Write-Host "Getting a list of VMs in host "$FromVMHostName -ForegroundColor Yellow #Get a list of VM on the server that should be migrated. only powered on VM.. I dont care about powered off VM $VMsInHost = Get-VMHost $FromVMHostName -ErrorAction Stop | Get-VM | where{ $_.PowerState -like "*On" } Write-Host "Total Number of VM to move is:"$VMsInHost.Count -ForegroundColor Yellow Foreach ($SingleVM in $VMsInHost){ #Creating an Object to store the progress report $VMnewLocation=new-object PSObject $VMnewLocation | Add-Member -NotePropertyName "VM Name" -NotePropertyValue $SingleVM.Name $VMnewLocation | Add-Member -NotePropertyName "Old Host" -NotePropertyValue $SingleVM.VMHost Write-host "Parsing VM " $SingleVM.Name -ForegroundColor Yellow #Call the function to get a list of possible servers to move the VM to. $Migrate=Get-MostFreeServer -NeededMemorySizeinGB $SingleVM.MemoryGB #PS_FAIL_No_Resource is a custom message will return from the function incase there is no available server to host the VM Migration. if ($Migrate -notlike "PS_FAIL_No_Resource"){ Write-Host "Moving "$SingleVM "to "$Migrate ",Please wait a few seconds" -ForegroundColor Yellow #Move the VM Move-VM -VM $SingleVM -Destination $Migrate -ErrorAction Stop sleep -Seconds 1 $VMnewLocation | Add-Member -NotePropertyName "New Host" -NotePropertyValue ((get-vm $SingleVM).vmhost.Name) Write-Host $SingleVM "is now in the following host" $VMnewLocation.'New Host' -ForegroundColor Yellow $Finalresult+=$VMnewLocation } Else { #No available server, the following message will be displayed. Write-Host "It seems there is no more servers to move the load, you can change the value of the MaxMemAllowed to allow more load... Nothing more to do." -ForegroundColor Red Write-Host "I cannot move "$SingleVM Write-Host "final report is:" $Finalresult $ErrorFlag=$true return } } } Catch [exception]{ # Any unexpected error will return here and stop the script execution. Write-Host $_.Exception.message -ForegroundColor Red $ErrorFlag=$true break } Finally{ #Checking the server is any more VM on it, if there is no VM, then place the server in maintenance Mode #Else, there should be an error indicating what is going on. if ($ErrorFlag -notlike $true){ if ((Get-VM | where{ ($_.host -like $FromVMHostName) -and ($_.PowerState -like "*on")}).count -eq 0) { Write-Host "All Done, will place the server in maintenance mode" -ForegroundColor Yellow Set-VMHost $FromVMHostName -State Maintenance Get-VMHost $FromVMHostName $Finalresult | ft } if ((Get-VM | where{ ($_.host -like $FromVMHostName) -and ($_.PowerState -like "*on")}).count -gt 0) { Write-Host "It seems that VM Migration not completed. maybe some resource issue" $Finalresult | ft } } } |
Stream # | Description | Introduced in |
---|---|---|
1 | Success Stream | PowerShell 2.0 |
2 | Error Stream | PowerShell 2.0 |
3 | Warning Stream | PowerShell 3.0 |
4 | Verbose Stream | PowerShell 3.0 |
5 | Debug Stream | PowerShell 3.0 |
6 | Information Stream | PowerShell 5.0 |
* | All Streams | PowerShell 3.0 |
Copy-Item -Path C:\MySource -Destination D:\MyDestination -Recurse 2> D:\MyDestination\CopyLog.txt