Set-CBT.psm1

function Set-CBT {
<#
    .NOTES
    ===========================================================================
    Created by: Markus Kraus
    Twitter: @VMarkus_K
    Private Blog: mycloudrevolution.com
    ===========================================================================
    Changelog:
    2016.11 ver 1.0 Base Release
    ===========================================================================
    External Code Sources:
    http://wahlnetwork.com/2015/12/01/change-block-tracking-cbt-powercli/
    ===========================================================================
    Tested Against Environment:
    vSphere Version: 5.5 U2
    PowerCLI Version: PowerCLI 6.3 R1
    PowerShell Version: 4.0
    OS Version: Windows Server 2012 R2
    ===========================================================================
    Keywords vSphere, ESXi, VM, Storage, CBT, Backup
    ===========================================================================
 
    .DESCRIPTION
    This Function enables or disables CBT.
 
    .Example
    Get-VN TST* | Set-CBT -DisableCBT
 
    .Example
    Get-VN TST* | Set-CBT -EnableCBT
 
    .PARAMETER DisableCBT
    Disables CBT for any VMs found with it enabled
 
    .PARAMETER EnableCBT
    Enables CBT for any VMs found with it disabled
 
#Requires PS -Version 4.0
#>


  [CmdletBinding()]
    param( 
        [Parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0, HelpMessage = "VMs to process")]
        [ValidateNotNullorEmpty()]
            [VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl[]] $myVMs,
        [Parameter(Mandatory = $False,ValueFromPipeline=$False, Position = 1, HelpMessage = "Enables CBT for any VMs found with it disabled", ParameterSetName = "EnableCBT")]
        [ValidateNotNullorEmpty()]
            [Switch]$EnableCBT,
        [Parameter(Mandatory = $False,ValueFromPipeline=$False, Position = 1, HelpMessage = "Disables CBT for any VMs found with it enabled", ParameterSetName = "DisableCBT")]
        [ValidateNotNullorEmpty()]
            [Switch]$DisableCBT
    )
Process { 

        $vmconfigspec = New-Object -TypeName VMware.Vim.VirtualMachineConfigSpec
        Write-Verbose -Message "Walking through given VMs"
        foreach($myVM in $myVMs)
        {
            if ($DisableCBT -and $myVM.ExtensionData.Config.ChangeTrackingEnabled -eq $true -and $myVM.ExtensionData.Snapshot -eq $null)
            {
                try 
                {
                    Write-Verbose -Message "Reconfiguring $($myVM.name) to disable CBT" -Verbose
                    $vmconfigspec.ChangeTrackingEnabled = $false
                    $myVM.ExtensionData.ReconfigVM($vmconfigspec)

                    if ($myVM.PowerState -eq "PoweredOn" ) {
                        Write-Verbose -Message "Creating a snapshot on $($myVM.name) to clear CBT file" -Verbose
                        $SnapShot = New-Snapshot -VM $myVM -Name "CBT Cleanup"

                        Write-Verbose -Message "Removing snapshot on $($myVM.name)" -Verbose
                        $SnapShot|  Remove-Snapshot -Confirm:$false
                    }

                }
                catch 
                {
                    throw $myVM
                }
            }
            elseif ($EnableCBT -and $myVM.ExtensionData.Config.ChangeTrackingEnabled -eq $false -and $myVM.ExtensionData.Snapshot -eq $null)
            {
                Write-Verbose -Message "Reconfiguring $($myVM.name) to enable CBT" -Verbose
                $vmconfigspec.ChangeTrackingEnabled = $true
                $myVM.ExtensionData.ReconfigVM($vmconfigspec)

                if ($myVM.PowerState -eq "PoweredOn" ) {
                    Write-Verbose -Message "Creating a snapshot on $($myVM.name) to Create CBT file" -Verbose
                    $SnapShot = New-Snapshot -VM $myVM -Name "CBT Cleanup"

                    Write-Verbose -Message "Removing snapshot on $($myVM.name)" -Verbose
                    $SnapShot |  Remove-Snapshot -Confirm:$false
                }
            }
            else 
            {
                if ($myVM.ExtensionData.Snapshot -ne $null -and $EnableCBT) 
                {
                    Write-Warning -Message "Skipping $($myVM.name) - Snapshots found"
                }
                elseif ($myVM.ExtensionData.Snapshot -ne $null -and $DisableCBT) 
                {
                    Write-Warning -Message "Skipping $($myVM.name) - Snapshots found"
                }
            }
        }

    }
}


# Thanks to Luc's article: http://www.lucd.info/viproperties/
# Usage: Get-VM -Name TST* | select Name, CBTEnabled

#Requires -Modules VMware.VimAutomation.Core, @{ModuleName="VMware.VimAutomation.Core";ModuleVersion="6.3.0.0"}
New-VIProperty -Name CBTEnabled -ObjectType VirtualMachine -ValueFromExtensionProperty "Config.ChangeTrackingEnabled" -Force