I'm trying to get a script to work that will svmotion all machines listed in folder to a new datastore cluster and new host (which are in a separate cluster) once the migration is completed, power on the vm.
The error I'm getting
Wait-Task : Cannot validate argument on parameter 'Task'. The argument is null or empty. Supply an argument that is not null or empty and then try the command again.
At C:\temp\svmotion\final.ps1:11 char:18
+ Wait-Task -Task <<<< $task
+ CategoryInfo : InvalidData: (:) [Wait-Task], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,VMware.VimAutomation.ViCore.Cmdlets.Commands.WaitTask
Here is my script
#Import Plugins and Connect to vCenter
Add-PSSnapin VMware.VimAutomation.Core
$creds = Get-Credential
$viserver = Read-Host "vCenter Server:"
Connect-VIServer -Server $viserver -Credential $creds
# Get a List of VM's from the relocation folder
$vmlist = get-vm -location "relocateme"
#Stoage vMotion each VM in selected cluster in a staged fashion
foreach($vm in $vmlist)
{
Write-Host Relocating..."$vm"
$task = Get-VM -Name $vm.Name | Move-VM -Datastore "Test Datastore" -Destination VMHOST1.NET
Wait-Task -task $task
Start-VM $vm.name
}
Once the script has exited get-vm -location "relocateme" shows the VM listed, however write-host $vmlist and write-host $vm both contain no data.
If I do write-host $task it is also blank. What am I missing?
The names of our VM's are long and contain special characters. Could this be the problem?. An example machine name is "AA-BB-CC-DD (Test Machine for Migrations)[T][+]" (excluding the commas).
I'm using Powercli 5.1
Any help would be greatly appreciated.
I found the issue is definitely related to the VM Name, if I shorten the test machines name to about 8 Characters it works. The original name must be too long
Can I svmotion using some other identifier other than the VM name?
That sounds very strange, the length of the displayname of the VM normally has nothing to do with this.
But you didn't use the RunAsync switch it seems
$task = Get-VM -Name $vm.Name | Move-VM -Datastore "Test Datastore" -Destination VMHOST1.NET -RunAsync
You don't get a Task object when you don't run the cmdlet in the background with the RunAsync switch
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thanks for your response.
Adding -RunAsync made no change
Attached is what I see when I run it. Notice when try to write out the contents of $task is comes back with 3 lines of blank space.
Which vSphere version are you running this against ?
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Vsphere 5.1 with ESXi hosts running 5.1.0. 799733
I've temporarily removed the $task = to try and get this working for 1 machine only, so this script is now this.
#Gets a list of Virtual Machines within the Folder that was identified before and assigns to a variable
$vms = get-vm -location "relocateme" | Select Name
Write-Host $vms
foreach ($vm in $vms) {
Get-VM -Name $vm.Name | Move-VM -Datastore "Test Datastore" -Destination VMHOST1.NET -RunAsync
}
I've renamed the machine and this is what I found:
AU-IT-SYD010 (Test Migration Machine)[TM][+]
(the original doesn't work)
AU-IT-SYD010
(works)
AU-IT-SYD010 (
(works)
AU-IT-SYD010 (Test Migration Machine)
(works)
AU-IT-SYD010 (Test Migration Machine)[
(fails!!!)
Get-VM : 9/05/2013 9:20:17 AM Get-VM The specified wildcard pattern is not valid: AU-IT-SYD010 (Test Migration Machine)[
At C:\temp\svmotion\svmotion7.ps1:14 char:8
So the problem is with the "[" symbol in the name of the machine.
Further more if I run the command with a "*" at the end it works.
Move-VM "AU-IT-SYD010 (Test Migration Machine)[TM][+]*" -Datastore "Test Datastore" -Destination VMHOST1.NET
Can I append a * to the end of each machine before the command is run?
The square brackets are meta characters for the Name parameter, that probably explains why you're seeing the failures.
If you place the name in single quotes it should work.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thanks for your help, the one-liner works fine.
To do this in a loop, is there a way to update the contents of $vms to add single quote to before and after the name?
You could use the single character meta character (?) , something like this
foreach ($vm in $vms) {
Get-VM -Name $vm.Name.Replace('[','?').Replace(']','?') |
Move-VM -Datastore "Test Datastore" -Destination VMHOST1.NET -RunAsync
}
But that is not a fool-proof method I admit.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference