Get the system uptime for one or more computers.

# Accept input from the pipeline
Param([Parameter(mandatory=$true,ValueFromPipeline=$true)] [string[]]$ComputerName = @("."))

# Process the piped input (one computer at a time)
process { 

    # See if it responds to a ping, otherwise the WMI queries will fail
    $query = "select * from win32_pingstatus where address = '$ComputerName'"
    $ping = Get-WmiObject -query $query
if ($ping.protocoladdress) {
    # Ping responded, so connect to the computer via WMI
    $os = Get-WmiObject Win32_OperatingSystem -ComputerName $ComputerName -ev myError -ea SilentlyContinue 

if ($myError -ne $null)
  # Error: WMI did not respond
  "$ComputerName did not respond"
   $LastBootUpTime = $os.ConvertToDateTime($os.LastBootUpTime)
   $LocalDateTime = $os.ConvertToDateTime($os.LocalDateTime)
   # Calculate uptime - this is automatically a timespan
   $up = $LocalDateTime - $LastBootUpTime

   # Split into Days/Hours/Mins
   $uptime = "$($up.Days) days, $($up.Hours)h, $($up.Minutes)mins" 

   # Save the results for this computer in an object
   $results = new-object psobject
   $results | add-member noteproperty LastBootUpTime $LastBootUpTime
   $results | add-member noteproperty ComputerName $os.csname
   $results | add-member noteproperty uptime $uptime

   # Display the results
   $results | Select-Object ComputerName,LastBootUpTime, uptime

# Next Ping result

# End of the process block


Assuming the script above is saved in the current directory as get-uptime.ps1 :

PS C:\> ./get-uptime "server64","server65","server66" -AsPSObject

PS C:\> $servers = cat servers.txt |sort
PS C:\> $servers |./get-uptime -AsPSObject

This script is based on an original by Alex K. Angelopoulos

“In any collection of data, the figure most obviously correct, beyond all need of checking, is the mistake” ~ Finagle's third law.


psinfo - List information about a system
pshinfo - Get information about a machine - Ram, Disk Space, Service pack, Uptime

Copyright © 1999-2017
Some rights reserved