Centrum Skryptów - Systemy Operacyjne

Jak usunąć pliki mające określoną liczbę godzin?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

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.

Jak usunąć pliki mające określoną liczbę godzin?

Cześć, Skrypciarze! Istnieją skrypty umożliwiające usuwanie wszystkich plików mających X dni, które znajdują się w danym folderze. Ja mam inny problem: chcę usunąć pliki mające X godzin, a nawet X minut. Jak to zrobić?

-- DF

Cześć, DF. Słyszeliście o takiej przepowiedni naukowców, że do roku 2050 ludzie i roboty będą wstępowali razem w związki małżeńskie? Pomijając kwestie etyczne, naukowcy ci są najzupełniej przekonani, że rok 2050 to najpóźniejsza data, kiedy takie związki staną się faktem.

Nie jestem ekspertem w sprawach robotów ani sztucznej inteligencji, ale ja jestem trochę sceptyczny w tej sprawie. W końcu sami spójrzcie na obecny stan robotyki. Przykładowo, roboty mogą być świetne w wykonywaniu jednej rzeczy (w zgrzewaniu punktowym samochodu na linii produkcyjnej, odkurzaniu mieszkania) ale w dalszym ciągu są ograniczonymi sawantami, a nie majstrami od wszystkiego. Roboty nie są dobre w prowadzeniu konwersacji; nie zwracają uwagi na ludzkie uczucia; nie są w stanie podarować nikomu żadnego drobiazgu – nawet kartki z życzeniami – na urodziny. Roboty nie radzą sobie same w życiu, wszystko trzeba robić za nie. Ech, roboty...

W sumie to, jak sobie o tym teraz myślę, z punktu widzenia typowej kobiety, przemiana mężczyzny w robota to nie byłaby jakaś wielka sprawa, nieprawdaż?

Interesujące jest jednak, że naukowcy nie przewidują, iż do roku 2050 roboty będą tworzyły rubrykę Cześć Skrypciarze!. Wielu mogłoby powiedzieć, że to dlatego, że niektóre zadania są trywialne i niewymagające myślenia, nawet jak na roboty. Ja jednak jestem zdania, że żaden robot nie napisałby skryptu takiego jak ten poniżej, który usuwa wszystkie pliki w folderze C:\Scripts starsze niż 8 godzin:

strComputer = "."



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



Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _

        & "ResultClass = CIM_DataFile")



strCurrentDate = Now



For Each objFile In colFiles

    strFileDate = WMIDateStringToDate(objFile.CreationDate)

    intHours = DateDiff("h", strFileDate, strCurrentDate)

    If intHours >= 8 Then

        Wscript.Echo objFile.Delete

    End If

Next



Function WMIDateStringToDate(dtmInstallDate)

    WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & _

        Mid(dtmInstallDate, 7, 2) & "/" & Left(dtmInstallDate, 4) _

            & " " & Mid (dtmInstallDate, 9, 2) & ":" & _

                Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate, _

                    13, 2))

End Function

Zobaczmy, jak to cacuszko działa. (wcale nie jest mi potrzebna do tego żadna pomoc ze strony robotów czytających tę rubrykę. Chociaż najwyraźniej potrzebna nam jest pomoc w mieszaniu drinka Tequila Sunrise (j.ang.), to my ludzie sami potrafimy wyjaśniać własne skrypty, dzięki wielkie.)

Jak widzicie (nie mówię do robotów, których laserowy wzrok zapewne zdążył już podpalić monitor), zaczynamy od połączenia się z usługą WMI na lokalnym komputerze. Chwileczkę, mamy pytanie. Oczywiście, że można uruchomić ten skrypt na zdalnym komputerze, wystarczy przypisać nazwę tego zdalnego komputera do zmiennej strComputer w taki oto sposób:

strComputer = "."
Uwaga. Nie, nie mam adresu IP zdalnego komputera, sami musicie się o niego postarać.

Po połączeniu się z usługą WMI używamy poniższego wiersza kodu oraz kwerendy Associators Of w celu pobrania kolekcji wszystkich plików (wystąpień klasy CIM_DataFile) znajdujących się w folderze C:\Scripts. Kiedy już mamy tę kolekcję, przypisujemy bieżącą datę i godzinę do zmiennej o nazwie strCurrentDate. Do tego służy nam ten oto wiersz kodu:

strCurrentDate = Now

W tym momencie możemy już usuwać pliki.

W tym celu, naszym pierwszym krokiem jest uruchomienie pętli For Each, która przejdzie przez wszystkie pliki znajdujące się w folderze C:\Scripts. Wewnątrz tej pętli najpierw wykonujemy poniższy wiersz kodu:

strFileDate = WMIDateStringToDate(objFile.CreationDate)

Co się tutaj dzieje? Wywołujemy funkcję o nazwie WMIDateStringToDate i przekazujemy właściwość CreationDate pliku jako parametr funkcji. Funkcja WMIDateStringToDate wykona pewne czynności związane z formatowaniem na tej dacie CreationDate, a następnie zachowa przeformatowaną wartość w zmiennej o nazwie strFileDate.

Po co nam takie skomplikowane czynności? No cóż, jak wiecie, (a nawet, jak wie większość robotów), usługa WMI zachowuje wartości daty i godziny w formacie UTC (Universal Time Coordinate). Czy to jakiś problem? Oczywiście, że tak. Oznacza to, że daty i godziny wyglądają tak:

20071211094327.000000+420

Jak można się spodziewać, arytmetyka dat wcale nie jest prosta, kiedy wyglądają one w ten sposób. Nasza funkcja ma za zadanie coś z tym zrobić.

Nie będę dzisiaj szczegółowo omawiał dat i godzin w formacie UTC ani wyjaśniał działania funkcji WMIDateStringToDate; więcej informacji na ten temat znajduje się w przewodniku Microsoft Windows 200 Scripting Guide (j.ang.) . Wspomnę tylko, że poszczególne kawałki typowej daty są zazwyczaj zachowane w określonych wcześniej lokalizacjach wartości UTC; przykładowo – pierwsze cztery cyfry (2007) reprezentują rok, następujące po nim dwie cyfry reprezentują miesiąc; itd. Nasza funkcja tworzy z wartości UTC (właściwość CreationDate ) po prostu bardziej czytelną (no dobra, czytelną dla ludzi) datę na podstawie tych różnych kawałków. Co dzięki temu otrzymujemy? Zmiennej o nazwie strFileDate zostaje przypisana następująca wartość:

12/11/2007 09:43.27

Z tą wartością ludzie radzą sobie znacznie lepiej. Co ważniejsze, lepiej radzi sobie z nią VBScript.

Jeżeli już o nim mowa, jak tylko otrzymamy przeformatowaną wartość daty i godziny, przekazujemy ją do VBScript i funkcji DateDiff:

intHours = DateDiff("h", strFileDate, strCurrentDate)

Funkcja DateDiff określa ilość czasu, jak upłynęła (lub jaka upłynie) pomiędzy dwoma datami. Jak widzimy, podczas wywoływania funkcji DateDiff przekazujemy jej trzy parametry:

  • "h". Ten parametr reprezentuje odstęp czasu, który chcemy pobrać. Chcemy określić wiek pliku w godzinach; dlatego przekazujemy wartość "h". Aby uzyskać wiek w minutach, należy zastosować tę wartość: "n". Kompletna lista parametrów funkcji DateDiff znajduje się w – zgadliście – przewodniku Microsoft Windows 2000 Scripting Guide (j.ang.).
  • strFileDate. Data i czas utworzenia pliku.
  • strCurrentDate. Bieżąca data i godzina. (Lub przynajmniej bieżąca data i godzina pierwszego uruchomienia skryptu.)

Jak zauważyliśmy, funkcja DateDiff obliczy wiek pliku w godzinach, następnie zachowa tę wartość w zmiennej intHours. Następnie zastosujemy poniższy wiersz kodu w celu określenia, czy plik ma więcej niż 8 godzin:

If intHours >= 8 Then
Uwaga: Technicznie rzecz biorąc sprawdzamy, czy każdy plik jest starszy lub równy 8 godzin. Dlaczego? Ponieważ funkcja DateDiff przekazuje jedynie wartości całkowite i tworzy je odejmując punkty po przecinku (a nie zaokrąglając w dół lub w górę) Przykładowo, przypuśćmy, że plik ma 8,5 godziny (8 godzin i 30 minut). W takim przypadku, funkcja DateDiff powie nam, że plik ma 8 godzin; a ponieważ 8 nie jest większe niż 8, ten plik nie zostanie usunięty. Za pomocą operatora „starszy lub równy” pozbędziemy się tego problemu.

Jeżeli plik ma ponad 8 godzin, wywołujemy metodę Delete i usuwamy plik. Jeżeli nie ma, wracamy na początek pętli i powtarzamy proces dla następnego pliku w kolekcji. Po zakończeniu, jedynymi plikami, które zostaną w folderze C:\Scripts będą te, które mają mniej niż 8 godzin. I o to nam chodziło.

Na wypadek, gdyby ktoś się zastanawiał, jako część badań postanowiłem pogmerać trochę w Internecie i poszukać informacji o robotach. Znalazłem stronę na temat Carebot 3.4 (j.ang.). Jednym z zasadniczych celów życia robota Carebot jest chodzenie za swoim właścicielem i werbalne przypominanie mu o wszystkich rzeczach, które powinien zrobić w danym momencie, a których akurat nie robi.

W sumie to, jak sobie o tym teraz myślę, z punktu widzenia typowego mężczyzny, przemiana kobiety w robota to nie byłaby jakaś wielka sprawa, nieprawdaż?

 Do początku strony Do początku strony

Centrum Skryptów - Systemy Operacyjne