Centrum Skryptów - Systemy Operacyjne

W jaki sposób określić czas systemowy na komputerze? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób określić czas systemowy na komputerze?

Cześć Skrypciarze! Czy istnieje jakiś sposób na pobranie czasu systemowego skonfigurowanego na komputerze zdalnym?

-- JJ

Cześć JJ. Istnieją co najmniej dwa sposoby i w obu używa się WMI. Jeśli pracujesz na Windows XP lub Windows Server 2003, możesz użyć klasy WMI Win32_LocalTime. Jak widać, to znacznie ułatwia uzyskanie czasu systemowego: łączysz się z komputerem zdalnym, wysyłasz zapytanie do klasy Win32_LocalTime, a następnie wywołujesz żądane wartości. Innymi słowy:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_LocalTime")



For Each objItem in colItems

    Wscript.Echo "Month: " & objItem.Month

    Wscript.Echo "Day: " & objItem.Day

    Wscript.Echo "Year: " & objItem.Year

    Wscript.Echo "Hour: " & objItem.Hour

    Wscript.Echo "Minute: " & objItem.Minute

    Wscript.Echo "Second: " & objItem.Second

Next

Dla urozmaicenia możesz połączyć wszystkie te wartości w standardowy ciąg data-czas, czyli coś w tym stylu: 1/26/2005 8:47:04 AM. Zrobi to ten skrypt:

On Error Resume Next



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * from Win32_LocalTime")



For Each objItem in colItems

    intMonth = objItem.Month

    intDay = objItem.Day

    intYear = objItem.Year



    dtmDate = intMonth & "/" & intDay & "/" & intYear



    intHour = objItem.Hour

    If intHour < 12 Then 

        strAMPM = "AM"

    Else

        intHour = intHour - 12

        strAMPM = "PM"

    End If

  

    intMinutes = objItem.Minute

    If intMinutes < 10 Then

        intMinutes = "0" & intMinutes

    End If



    intSeconds = objItem.Second

    If intSeconds < 10 Then

        intSeconds = "0" & intSeconds

    End If



    dtmTime = intHour & ":" & intMinutes & ":" & intSeconds & " " & strAMPM

    

    Wscript.Echo dtmDate & " " & dtmTime

Next

Nie będziemy wyjaśniać każdej linii kodu w skrypcie, ale większość tego, co tu robimy, to łączenie wartości. Prawdę mówiąc są tu tylko dwie lekko podstępne rzeczy. Po pierwsze, sprawdzamy, czy wartość godziny jest mniejsza od 12; jeśli tak, to na końcu ciągu dodajemy AM (przed południem); jeśli nie, na końcu ciągu znajdzie się PM (po południu). Owszem, to oznacza, że godzina jest zwracana w formacie 24-godzinnym; tym sposobem 3:00 po południu stanie się 15:00. Dlatego też jeśli wartość godziny jest wyższa od 12, odejmujemy 12. Wówczas 15:00 zmieni się w 3:00.

Zarówno dla minut, jak i dla sekund, sprawdzamy, czy zwrócona wartość jest niższa niż 10. Po co? Cóż, przypuśćmy, że mamy godzinę 8, minut 6 i 5 sekund. Jeśli połączymy te wartości w takiej postaci, nasz czas będzie wynosił 8:6:5. Nie bardzo to wygląda na czas, prawda? Dlatego też jeżeli wartości minut i sekund są niższe niż 10, do obu dodajemy z przodu 0. Teraz łączymy 8, 06 i 05, i otrzymujemy czas 08:06:05. Teraz lepiej.

Klasa Win32_LocalTime nie istnieje niestety w Windows 2000. Czas systemowy można jednak uzyskać przez wysłanie zapytania do klasy Win32_OperatingSystem i sprawdzenie wartości właściwości LocalTime. Kłopot polega na tym, że data i godzina zostaną zwrócone w formacie UTC (Universal Time Coordinate – czas uniwersalny), co oznacza, że będą wyglądały tak: 20050127080605.000000+480. Fuj.

Nie będziemy wdawać się w szczegóły dotyczące formatu UTC; zainteresowanych zapraszamy do lektury tego rozdziału (j.ang.)Przewodnika Skryptowania Microsoft Windows 2000. Pokażemy Ci za to skrypt, który konwertuje wartość LocalDateTime na nieco bardziej czytelny format:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")



For Each objItem in colItems

    dtmLocalTime = objItem.LocalDateTime

    dtmMonth = Mid(dtmLocalTime, 5, 2)

    dtmDay = Mid(dtmLocalTime, 7, 2)

    dtmYear = Left(dtmLocalTime, 4)

    dtmHour = Mid(dtmLocalTime, 9, 2)

    dtmMinutes = Mid(dtmLocalTime, 11, 2)

    dtmSeconds = Mid(dtmLocalTime, 13, 2)

Next



dtmNewDate = dtmMonth & "/" & dtmDay & "/" & dtmYear

dtmNewTime =  dtmHour & ":" & dtmMinutes & ":" & dtmSeconds



Wscript.Echo dtmNewDate & " " & dtmNewTime

Niewiele tu formatowania; na przykład, nie przekonwertowaliśmy 15:00 na 3:00, nie określiliśmy też, czy czas jest AM, czy PM. To jednak można zrobić samemu, tym samym sposobem, którego użyliśmy przy Win32_LocalTime.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne