Public/Update-VMTools.ps1

Function Update-VMTools {

    <#
    .SYNOPSIS
    -Taylor Lee
    Modified 06132019
 
    .DESCRIPTION
    Filter out 2003 servers and upgrade VMwaretools on all servers that are not up to date. Does not reboot the VM's.
 
    .EXAMPLE
    Upgrades only tools that are installed an require it. Specify a path for a log file.
 
    Update-VMTools
 
    .EXAMPLE
    Specify a path for a log file and include unmanaged VM's.
 
    Update-VMTools -Unmanaged
 
    .NOTES
    Requires the VMware.PowerCLI Module
    #>


    [CmdletBinding(SupportsShouldProcess)]
    Param (
        [Parameter(Mandatory = $false)][switch]$Unmanaged
    )

    #Set Error Action to ignor errors
    $ErrorActionPreference = 'SilentlyContinue'

    #Filter Out 2003 Servers
    $No2003VMs = Get-VM | Where-Object { $_.Guest -notlike '*2003*' }

    #Disclaimer
    Write-Host "Some VMs will fail to upgrade. Use Get-VMTools to see which VM's fail" -ForegroundColor Yellow
    Write-Host " "

    if ($Unmanaged) {
        #Get VM's that require tools upgrades
        $OutofDateVMs = Get-VM $No2003VMs |
        ForEach-Object { Get-View $_.id } |
        Where-Object { $_.Guest.ToolsVersionStatus -like 'guestToolsNeedUpgrade' -or $_.Guest.ToolsVersionStatus -like 'guestToolsNotInstalled' } |
        Select-Object name, @{Name = 'ToolsVersion'; Expression = { $_.config.tools.toolsversion } }, @{Name = 'ToolStatus'; Expression = { $_.Guest.ToolsVersionStatus } }

        #Update Tools with no Reboot
        ForEach ($VM in $OutOfDateVMs) {
            Write-Host "Upgrading VMWareTools On: " -ForegroundColor Yellow -NoNewline
            Write-Host $VM.name -ForegroundColor Cyan
            Update-Tools -NoReboot -VM $VM.Name
        }
    }

    else {
        #Get VM's that require tools upgrades and filter unmanaged VM's
        $OutofDateVMs = Get-VM $No2003VMs |
        ForEach-Object { Get-View $_.id } |
        Where-Object { $_.Guest.ToolsVersionStatus -like 'guestToolsNeedUpgrade' } |
        Select-Object name, @{Name = 'ToolsVersion'; Expression = { $_.config.tools.toolsversion } }, @{Name = 'ToolStatus'; Expression = { $_.Guest.ToolsVersionStatus } }

        #Update Tools with no Reboot
        ForEach ($VM in $OutOfDateVMs) {
            Write-Host "Upgrading VMWareTools On: " -ForegroundColor Yellow -NoNewline
            Write-Host $VM.name -ForegroundColor Cyan
            Update-Tools -NoReboot -VM $VM.Name
        }
    }

}