Pobieranie uptime systemu

maly186

Uptime to czas jaki minął od uruchomienia systemu. W systemie Windows klasa WMI Win32_OperatingSystem przechowuje we właściwości LastBootUpTime czas ostatniego uruchomienia systemu.

Zacznijmy od pobrania tej klasy WMI:

PS scripts:\> $wmi=get-wmiobject -Class Win32_OperatingSystem

Uptime jest przechowywany we właściwości LastBootupTime tej klasy w formie łańcucha znaków o formacie yyyymmddhhnnss
gdzie
yyyy - rok
mm - miesiąc
dd - dzien
hh - godzina
nn - minuta
ss - sekunda

Teraz trzeba wyciągnąć z tego łańcucha poszczególne fragmenty

PS scripts:\> $LastBootUp=$wmi.LastBootUpTime     
PS scripts:\> $year=$LastBootUp.substring(0,4)    
PS scripts:\> $month=$LastBootUp.substring(4,2)   
PS scripts:\> $day=$LastBootUp.substring(6,2)     
PS scripts:\>                                     
PS scripts:\> $hour=$LastBootUp.substring(8,2)    
PS scripts:\> $minute=$LastBootUp.substring(10,2) 
PS scripts:\> $second=$LastBootUp.substring(12,2) 

W zmiennych $year, $month, $day, $hour, $minute, $second znajdują sie poszczególne składowe czasu.
Ale to nadal czas uruchomienia a nie uptime. Jak policzyć różnicę czasu między czasem aktualnym a czasem uruchomienia? Tu z pomocą przychodzi nam klasa System.DateTime. Tworzymy obiekt tej klasy i odejmujemy od czasu aktualnego:

PS scripts:\> $reboottime=new-object System.DateTime($year,$month,$day,$hour,$minute,$second)                                                                   
PS scripts:\> $uptime=[System.DateTime]::Now.Subtract($reboottime)

Teraz w zmiennej $uptime mamy uptime systemu:

PS scripts:\> $uptime                
                                     
                                     
Days              : 0                
Hours             : 3                
Minutes           : 0                
Seconds           : 45               
Milliseconds      : 532              
Ticks             : 108455322038     
TotalDays         : 0,125526993099537
TotalHours        : 3,01264783438889 
TotalMinutes      : 180,758870063333 
TotalSeconds      : 10845,5322038    
TotalMilliseconds : 10845532,2038    
                                     
                                     
                                     
PS scripts:\>                        

Żeby było wygodniej możemy umieścić cały kod w skrypcie, tak by potem uruchamiać go jedną linijką. Ważne jest by dodać na samym końcu skryptu linijkę

return $uptime

Inaczej skrypt nie zwróci wartości.

2 komentarzy

Dziwne... Wydawało mi się, że dodałem do Gotowców, ale cóż... Brak wprawy. Następnym razem się poprawie

Oczywiście zamiast wyświetlać po prostu zmienną $uptime można to przerobić by pokazywało w "ładniejszej" dla człowieka formie, na przykład ja stosuję coś takiego:

Write-Host "$($uptime.days)" -NoNewLine -ForeGroundColor Green
Write-Host " days, " -NoNewLine
Write-Host "$($uptime.Hours)" -NoNewLine -ForeGroundColor Green
Write-Host " hours, " -NoNewLine
Write-Host "$($uptime.Minutes)" -NoNewLine -ForeGroundColor Green
Write-Host " minutes, " -NoNewLine
Write-Host "$($uptime.seconds)" -NoNewLine -ForeGroundColor Green
Write-Host " seconds"

PS. Umieściłeś tekst w głównej kategorii, przeniosłem do PowerShellowych gotowców. I zachęcam do pisania dalej ;-)