Skip to content

Move-VirtualMachine

VMware: Move the virtual machine to another location

#Requires -Version 5.1
#Requires -Modules VMware.VimAutomation.Core
[CmdletBinding(DefaultParameterSetName = "toDatastore")]
Param(
    [Parameter(Mandatory = $true, ParameterSetName = "toDatastore")]
    [Parameter(Mandatory = $true, ParameterSetName = "toDatacenter")]
    [Parameter(Mandatory = $true, ParameterSetName = "toFolder")]
    [Parameter(Mandatory = $true, ParameterSetName = "toHost")]
    [Parameter(Mandatory = $true, ParameterSetName = "toResourcePool")]
    [string]$VIServer,
    [Parameter(Mandatory = $true, ParameterSetName = "toDatastore")]
    [Parameter(Mandatory = $true, ParameterSetName = "toDatacenter")]
    [Parameter(Mandatory = $true, ParameterSetName = "toFolder")]
    [Parameter(Mandatory = $true, ParameterSetName = "toHost")]
    [Parameter(Mandatory = $true, ParameterSetName = "toResourcePool")]
    [pscredential]$VICredential,
    [Parameter(Mandatory = $true, ParameterSetName = "toDatastore")]
    [Parameter(Mandatory = $true, ParameterSetName = "toDatacenter")]
    [Parameter(Mandatory = $true, ParameterSetName = "toFolder")]
    [Parameter(Mandatory = $true, ParameterSetName = "toHost")]
    [Parameter(Mandatory = $true, ParameterSetName = "toResourcePool")]
    [string]$VMName,
    [Parameter(Mandatory = $true, ParameterSetName = "toDatastore")]
    [string]$DatastoreName,
    [Parameter(Mandatory = $true, ParameterSetName = "toDatacenter")]
    [string]$DatacenterName,
    [Parameter(Mandatory = $true, ParameterSetName = "toFolder")]
    [string]$FolderName,
    [Parameter(Mandatory = $true, ParameterSetName = "toHost")]
    [string]$HostName,
    [Parameter(Mandatory = $true, ParameterSetName = "toResourcePool")]
    [string]$ResourcePoolName,
    [Parameter(ParameterSetName = "toDatastore")]
    [ValidateSet("Thin", "Thick", "EagerZeroedThick")]
    [string]$DiskStorageFormat = "Thick"
)
Process {
    $vmServer = $null
    try {
        [string[]]$Properties = @('Name', 'Id', 'PowerState', 'NumCpu', 'Notes', 'Guest', 'GuestId', 'MemoryMB', 'UsedSpaceGB', 'ProvisionedSpaceGB', 'Folder')
        $vmServer = Connect-VIServer -Server $VIServer -Credential $VICredential -ErrorAction Stop
        $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        $machine = Get-VM -Server $vmServer -Name $VMName -ErrorAction Stop
        $cmdArgs = @{ ErrorAction = 'Stop'; Server = $vmServer; VM = $machine; Confirm = $false }
        if ($PSCmdlet.ParameterSetName -eq "toFolder") {
            $folder = Get-Folder -Server $vmServer -Name $FolderName -Type VM -ErrorAction Stop
            $cmdArgs.Add('InventoryLocation', $folder)
        }
        if ($PSCmdlet.ParameterSetName -eq "toDatacenter") {
            $center = Get-Datacenter -Server $vmServer -Name $DatacenterName -ErrorAction Stop
            $cmdArgs.Add('InventoryLocation', $center)
        }
        if ($PSCmdlet.ParameterSetName -eq "toHost") {
            $destination = Get-VMHost -Server $vmServer -Name $HostName -ErrorAction Stop
            $cmdArgs.Add('Destination', $destination)
        }
        if ($PSCmdlet.ParameterSetName -eq "toResourcePool") {
            $destination = Get-ResourcePool -Server $vmServer -Name $ResourcePoolName -ErrorAction Stop
            $cmdArgs.Add('Destination', $destination)
        }
        if ($PSCmdlet.ParameterSetName -eq "toDatastore") {
            $store = Get-Datastore -Server $vmServer -Name $DatastoreName -ErrorAction Stop
            $cmdArgs.Add('Datastore', $store)
            $cmdArgs.Add('DiskStorageFormat', $DiskStorageFormat)
        }
        $result = Move-VM @cmdArgs | Select-Object $Properties
        foreach ($item in $result) {
            $item | Add-Member -NotePropertyName 'Timestamp' -NotePropertyValue $timestamp -Force
            Write-Output $item
        }
    }
    catch { throw }
    finally { if ($null -ne $vmServer) { Disconnect-VIServer -Server $vmServer -Force -Confirm:$false -ErrorAction SilentlyContinue } }
}

IP address or DNS name of the vSphere server

PSCredential object for authenticating with the server

Name of the virtual machine

Datastore where to move the VM

Datacenter where to move the VM

Folder where to move the VM

Host where to move the VM

Resource pool where to move the VM

New storage format for the hard disk

An interactive directory of PowerShell scripts.