Public/Restart-AnyStackVmTools.ps1

function Restart-AnyStackVmTools {
    <#
    .SYNOPSIS
        Restarts VM Tools inside the guest OS.
    .DESCRIPTION
        Calls RestartGuest.
    .PARAMETER Server
        vCenter Server hostname or VIServer object. Uses active connection if omitted.
    .PARAMETER VmName
        Filter by VM name.
    .PARAMETER ClusterName
        Filter by cluster.
    .EXAMPLE
        PS> Restart-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)] Restarting 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.ToolsRunningStatus,Guest.ToolsVersion }
            
            foreach ($vm in $vms) {
                if ($vm.Guest.ToolsRunningStatus -eq 'guestToolsRunning') {
                    if ($PSCmdlet.ShouldProcess($vm.Name, "Restart Guest OS via Tools")) {
                        Invoke-AnyStackWithRetry -ScriptBlock { $vm.RestartGuest() }
                        
                        [PSCustomObject]@{
                            PSTypeName       = 'AnyStack.VmToolsRestart'
                            Timestamp        = (Get-Date)
                            Server           = $vi.Name
                            VmName           = $vm.Name
                            ToolsVersion     = $vm.Guest.ToolsVersion
                            ToolsStatus      = $vm.Guest.ToolsRunningStatus
                            RestartInitiated = $true
                        }
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new($_, 'UnexpectedError', [System.Management.Automation.ErrorCategory]::NotSpecified, $null))
        }
    }
}