Public/Get-AnyStackVmUptime.ps1

function Get-AnyStackVmUptime {
    <#
    .SYNOPSIS
        Calculates VM uptime.
    .DESCRIPTION
        Uses Runtime.BootTime to calculate uptime.
    .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> Get-AnyStackVmUptime
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: The AnyStack Architect
        Requires: VCF.PowerCLI 9.0+, vSphere 8.0 U3+
    #>

    [CmdletBinding(SupportsShouldProcess=$false)]
    [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)] Calculating VM uptimes on $($vi.Name)"
            $filter = if ($VmName) { @{Name="*$VmName*"} } else { $null }
            $vms = Invoke-AnyStackWithRetry -ScriptBlock { Get-View -Server $vi -ViewType VirtualMachine -Filter $filter -Property Name,Runtime.BootTime,Runtime.PowerState }
            
            foreach ($vm in $vms) {
                if ($vm.Runtime.PowerState -eq 'poweredOn') {
                    $uptime = (Get-Date) - $vm.Runtime.BootTime
                    [PSCustomObject]@{
                        PSTypeName  = 'AnyStack.VmUptime'
                        Timestamp   = (Get-Date)
                        Server      = $vi.Name
                        VmName      = $vm.Name
                        BootTime    = $vm.Runtime.BootTime
                        UptimeDays  = [Math]::Round($uptime.TotalDays, 1)
                        UptimeHours = [Math]::Round($uptime.TotalHours, 1)
                        PowerState  = $vm.Runtime.PowerState
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new(function Get-AnyStackVmUptime {
    <#
    .SYNOPSIS
        Calculates VM uptime.
    .DESCRIPTION
        Uses Runtime.BootTime to calculate uptime.
    .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> Get-AnyStackVmUptime
    .OUTPUTS
        PSCustomObject
    .NOTES
        Author: The AnyStack Architect
        Requires: VCF.PowerCLI 9.0+, vSphere 8.0 U3+
    #>

    [CmdletBinding(SupportsShouldProcess=$false)]
    [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)] Calculating VM uptimes on $($vi.Name)"
            $filter = if ($VmName) { @{Name="*$VmName*"} } else { $null }
            $vms = Invoke-AnyStackWithRetry -ScriptBlock { Get-View -Server $vi -ViewType VirtualMachine -Filter $filter -Property Name,Runtime.BootTime,Runtime.PowerState }
            
            foreach ($vm in $vms) {
                if ($vm.Runtime.PowerState -eq 'poweredOn') {
                    $uptime = (Get-Date) - $vm.Runtime.BootTime
                    [PSCustomObject]@{
                        PSTypeName  = 'AnyStack.VmUptime'
                        Timestamp   = (Get-Date)
                        Server      = $vi.Name
                        VmName      = $vm.Name
                        BootTime    = $vm.Runtime.BootTime
                        UptimeDays  = [Math]::Round($uptime.TotalDays, 1)
                        UptimeHours = [Math]::Round($uptime.TotalHours, 1)
                        PowerState  = $vm.Runtime.PowerState
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError([System.Management.Automation.ErrorRecord]::new($_, 'UnexpectedError', [System.Management.Automation.ErrorCategory]::NotSpecified, $null))
        }
    }
}

 



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