No, it works when I use the API. I didn't test that exact code but what I was able to make work earlier (that I got from an earlier post of your's) is very similar, posted below. I'm guessing I don't need all the additional parameters. I'll need to simplify my function to use your latest code.
$spec = New-Object VMware.Vim.VirtualMachineRelocateSpec
$spec.datastore = $DSMoRef
$vmobj.ExtensionData.Config.Hardware.Device |
where {$_ -is [VMware.Vim.VirtualDisk]} | %{
$disk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator
$disk.diskId = $_.Key
$disk.datastore = $DSMoRef
$disk.diskBackingInfo = New-Object VMware.Vim.VirtualDiskFlatVer2BackingInfo
$disk.diskBackingInfo.fileName = $_.Backing.FileName
$disk.diskBackingInfo.datastore = $DSMoRef
$disk.diskBackingInfo.diskMode = "persistent"
$disk.diskBackingInfo.split = $false
$disk.diskBackingInfo.writeThrough = $false
$disk.diskBackingInfo.thinProvisioned = $true
$disk.diskBackingInfo.eagerlyScrub = $false
$disk.diskBackingInfo.uuid = $_.Backing.Uuid
$disk.diskBackingInfo.contentId = $_.Backing.ContentId
$disk.diskBackingInfo.digestEnabled = $false
$spec.disk += $disk
}
$MoveTask = $vmobj.ExtensionData.RelocateVM_Task($spec, $null)