Public/Update-AnyStackVmTools.ps1

function Update-AnyStackVmTools {
    <#
    .SYNOPSIS
        Upgrades VM Tools.
    .DESCRIPTION
        Calls UpgradeTools_Task.
    .PARAMETER Server
        vCenter Server hostname or VIServer object. Uses active connection if omitted.
    .PARAMETER VmName
        Filter by VM name.
    .PARAMETER ClusterName
        Filter by cluster name.
    .EXAMPLE
        PS> Update-AnyStackVmTools -VmName 'DB-01'
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: The AnyStack Architect
        Requires: VCF.PowerCLI 9.0+, vSphere 8.0 U3+
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
        [ValidateNotNull()]
        $Server,
        [Parameter(Mandatory=$false)]
        [string]$VmName,
        [Parameter(Mandatory=$false)]
        [string]$ClusterName
    )
    begin {
        $vi = Get-AnyStackConnection -Server $Server
        $ErrorActionPreference = 'Stop'
    }
    process {
        try {
            Write-Verbose "[$($MyInvocation.MyCommand.Name)] Upgrading VM tools on $($vi.Name)"
            $filter = if ($VmName) { @{Name="*$VmName*"} } else { $null }
            $vms = Invoke-AnyStackWithRetry -ScriptBlock { Get-View -Server $vi -ViewType VirtualMachine -Filter $filter -Property Name,Guest.ToolsVersion,Guest.ToolsVersionStatus,Runtime.PowerState }
            
            foreach ($vm in $vms) {
                if ($vm.Guest.ToolsVersionStatus -in 'guestToolsNeedUpgrade','guestToolsNotInstalled') {
                    if ($PSCmdlet.ShouldProcess($vm.Name, "Upgrade VM Tools")) {
                        $taskRef = Invoke-AnyStackWithRetry -ScriptBlock { $vm.UpgradeTools_Task($null) }
                        
                        [PSCustomObject]@{
                            PSTypeName     = 'AnyStack.VmToolsUpgrade'
                            Timestamp      = (Get-Date)
                            Server         = $vi.Name
                            VmName         = $vm.Name
                            CurrentVersion = $vm.Guest.ToolsVersion
                            TargetVersion  = 'latest'
                            TaskId         = $taskRef.Value
                            Status         = 'Upgrading'
                        }
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new(function Update-AnyStackVmTools {
    <#
    .SYNOPSIS
        Upgrades VM Tools.
    .DESCRIPTION
        Calls UpgradeTools_Task.
    .PARAMETER Server
        vCenter Server hostname or VIServer object. Uses active connection if omitted.
    .PARAMETER VmName
        Filter by VM name.
    .PARAMETER ClusterName
        Filter by cluster name.
    .EXAMPLE
        PS> Update-AnyStackVmTools -VmName 'DB-01'
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: The AnyStack Architect
        Requires: VCF.PowerCLI 9.0+, vSphere 8.0 U3+
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
        [ValidateNotNull()]
        $Server,
        [Parameter(Mandatory=$false)]
        [string]$VmName,
        [Parameter(Mandatory=$false)]
        [string]$ClusterName
    )
    begin {
        $vi = Get-AnyStackConnection -Server $Server
        $ErrorActionPreference = 'Stop'
    }
    process {
        try {
            Write-Verbose "[$($MyInvocation.MyCommand.Name)] Upgrading VM tools on $($vi.Name)"
            $filter = if ($VmName) { @{Name="*$VmName*"} } else { $null }
            $vms = Invoke-AnyStackWithRetry -ScriptBlock { Get-View -Server $vi -ViewType VirtualMachine -Filter $filter -Property Name,Guest.ToolsVersion,Guest.ToolsVersionStatus,Runtime.PowerState }
            
            foreach ($vm in $vms) {
                if ($vm.Guest.ToolsVersionStatus -in 'guestToolsNeedUpgrade','guestToolsNotInstalled') {
                    if ($PSCmdlet.ShouldProcess($vm.Name, "Upgrade VM Tools")) {
                        $taskRef = Invoke-AnyStackWithRetry -ScriptBlock { $vm.UpgradeTools_Task($null) }
                        
                        [PSCustomObject]@{
                            PSTypeName     = 'AnyStack.VmToolsUpgrade'
                            Timestamp      = (Get-Date)
                            Server         = $vi.Name
                            VmName         = $vm.Name
                            CurrentVersion = $vm.Guest.ToolsVersion
                            TargetVersion  = 'latest'
                            TaskId         = $taskRef.Value
                            Status         = 'Upgrading'
                        }
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new(function Update-AnyStackVmTools {
    <#
    .SYNOPSIS
        Upgrades VM Tools.
    .DESCRIPTION
        Calls UpgradeTools_Task.
    .PARAMETER Server
        vCenter Server hostname or VIServer object. Uses active connection if omitted.
    .PARAMETER VmName
        Filter by VM name.
    .PARAMETER ClusterName
        Filter by cluster name.
    .EXAMPLE
        PS> Update-AnyStackVmTools -VmName 'DB-01'
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: The AnyStack Architect
        Requires: VCF.PowerCLI 9.0+, vSphere 8.0 U3+
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
        [ValidateNotNull()]
        $Server,
        [Parameter(Mandatory=$false)]
        [string]$VmName,
        [Parameter(Mandatory=$false)]
        [string]$ClusterName
    )
    begin {
        $vi = Get-AnyStackConnection -Server $Server
        $ErrorActionPreference = 'Stop'
    }
    process {
        try {
            Write-Verbose "[$($MyInvocation.MyCommand.Name)] Upgrading VM tools on $($vi.Name)"
            $filter = if ($VmName) { @{Name="*$VmName*"} } else { $null }
            $vms = Invoke-AnyStackWithRetry -ScriptBlock { Get-View -Server $vi -ViewType VirtualMachine -Filter $filter -Property Name,Guest.ToolsVersion,Guest.ToolsVersionStatus,Runtime.PowerState }
            
            foreach ($vm in $vms) {
                if ($vm.Guest.ToolsVersionStatus -in 'guestToolsNeedUpgrade','guestToolsNotInstalled') {
                    if ($PSCmdlet.ShouldProcess($vm.Name, "Upgrade VM Tools")) {
                        $taskRef = Invoke-AnyStackWithRetry -ScriptBlock { $vm.UpgradeTools_Task($null) }
                        
                        [PSCustomObject]@{
                            PSTypeName     = 'AnyStack.VmToolsUpgrade'
                            Timestamp      = (Get-Date)
                            Server         = $vi.Name
                            VmName         = $vm.Name
                            CurrentVersion = $vm.Guest.ToolsVersion
                            TargetVersion  = 'latest'
                            TaskId         = $taskRef.Value
                            Status         = 'Upgrading'
                        }
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new(function Update-AnyStackVmTools {
    <#
    .SYNOPSIS
        Upgrades VM Tools.
    .DESCRIPTION
        Calls UpgradeTools_Task.
    .PARAMETER Server
        vCenter Server hostname or VIServer object. Uses active connection if omitted.
    .PARAMETER VmName
        Filter by VM name.
    .PARAMETER ClusterName
        Filter by cluster name.
    .EXAMPLE
        PS> Update-AnyStackVmTools -VmName 'DB-01'
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: The AnyStack Architect
        Requires: VCF.PowerCLI 9.0+, vSphere 8.0 U3+
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
        [ValidateNotNull()]
        $Server,
        [Parameter(Mandatory=$false)]
        [string]$VmName,
        [Parameter(Mandatory=$false)]
        [string]$ClusterName
    )
    begin {
        $vi = Get-AnyStackConnection -Server $Server
        $ErrorActionPreference = 'Stop'
    }
    process {
        try {
            Write-Verbose "[$($MyInvocation.MyCommand.Name)] Upgrading VM tools on $($vi.Name)"
            $filter = if ($VmName) { @{Name="*$VmName*"} } else { $null }
            $vms = Invoke-AnyStackWithRetry -ScriptBlock { Get-View -Server $vi -ViewType VirtualMachine -Filter $filter -Property Name,Guest.ToolsVersion,Guest.ToolsVersionStatus,Runtime.PowerState }
            
            foreach ($vm in $vms) {
                if ($vm.Guest.ToolsVersionStatus -in 'guestToolsNeedUpgrade','guestToolsNotInstalled') {
                    if ($PSCmdlet.ShouldProcess($vm.Name, "Upgrade VM Tools")) {
                        $taskRef = Invoke-AnyStackWithRetry -ScriptBlock { $vm.UpgradeTools_Task($null) }
                        
                        [PSCustomObject]@{
                            PSTypeName     = 'AnyStack.VmToolsUpgrade'
                            Timestamp      = (Get-Date)
                            Server         = $vi.Name
                            VmName         = $vm.Name
                            CurrentVersion = $vm.Guest.ToolsVersion
                            TargetVersion  = 'latest'
                            TaskId         = $taskRef.Value
                            Status         = 'Upgrading'
                        }
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new($_, 'UnexpectedError', [System.Management.Automation.ErrorCategory]::NotSpecified, $null))
        }
    }
}

 



.Exception, 'UnexpectedError', [System.Management.Automation.ErrorCategory]::NotSpecified, $null))
        }
    }
}

 




.Exception, 'UnexpectedError', [System.Management.Automation.ErrorCategory]::NotSpecified, $null))
        }
    }
}

 



.Exception, 'UnexpectedError', [System.Management.Automation.ErrorCategory]::NotSpecified, $null))
        }
    }
}