Connect-VIServer itdvmvc1.nd.gov -Credential $PrvCred $BisSQLVMs = [System.Collections.ArrayList]@() $BisSQLVMs += Get-DatastoreCluster WINDOWS1* | Get-VM -Tag 'SQL MSDN' | sort-object Name $BisSQLVMs += Get-DatastoreCluster WINDOWS1* | Get-VM -Tag 'SQL Enterprise Academic' | sort-object Name $BisSQLVMs += Get-DatastoreCluster WINDOWS1* | Get-VM -Tag 'SQL Standard' | sort-object Name $BisSQLVMs = $BisSQLVMs | sort-object -Descending ProvisionedSpaceGB # SQL / IndPer first ForEach ($VM in $BisSQLVMs) { $DatastoreDestination = Get-DatastoreCluster WINDOWS1_FS92_SQL $VM | Move-VM -DiskStorageFormat Thick -Datastore $DatastoreDestination } $BisVMs = Get-DatastoreCluster WINDOWS1_A9K_General | Get-VM | Sort-Object -Descending UsedSpaceGB $DatastoreDestination = Get-DatastoreCluster WINDOWS1_FS92_General ForEach ($VM in $BisVMs) { $wait = $true $DatastoreHighestFreeSpaceGB = $DatastoreDestination | Get-Datastore | Sort-Object -Descending FreeSpaceGB | Select -First 1 If($VM.UsedSpaceGB -gt $DatastoreHighestFreeSpaceGB.FreeSpace) { While ($wait -eq $true) { $tasks = Get-Task | where-object { $_.Name -like "Relocate*" -or $_.Name -like "ApplyStorageDrsRecommendation*" } | where-object { $_.State -eq "Running" } If (@($tasks).count -lt 3) { $wait = $false } else { $wait = $true Write-Warning ("[$VM]:Start sleep " + (Get-Date)) Write-Verbose @($tasks).count Start-Sleep -Seconds 20 } } $VM | Move-VM -Datastore $DatastoreDestination Start-Sleep -Seconds 10 } Else { Write-Error ("Not enough free space available for " + $VM.Name + ". Available: " + $DatastoreHighestFreeSpaceGB.FreeSpaceGB + "GB available, " + $VM.UsedSpaceGB + "GB required.") -ErrorAction Stop Stop Exit } }