Centrum skryptów - Systemy operacyjne

Jak mogę usunąć wszystkie pliki starsze od podanej daty? 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.

Jak mogę usunąć wszystkie pliki starsze od podanej daty?

Cześć Skrypciarzu! Chciałbym napisać skrypt który przeszukuje komputer w poszukiwaniu plików utworzonych przed określonym dniem, po czym je usuwa. Czy to możliwe?

-- GM

Cześć GM. Czy można napisać skrypt usuwający wszystkie stare pliki? No jasne że można. Ale odrębną kwestią jest, czy taki skrypt warto napisać. Zajmiemy się tym za chwilę.

Zacznijmy od samego kodu. Oto skrypt wyszukujący na dysku wszystkie pliki utworzone przed 2 listopada 2003 r. i wyświetlający ich nazwy:

strDate = "20031102000000.000000+000"



strComputer = "."

Set objWMIService = GetObject _

    ("winmgmts:\\" & strComputer & "\root\cimv2")

Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'")

For Each objFile in colFiles

    Wscript.Echo objFile.Name

Next

Wiemy o czym myślisz: zastanawiasz się, skąd skrypt wie, że chodzi akurat o 2 listopada 2003. Przecie data ta nie jest w ogóle podana w skrypcie!

Możesz wierzyć albo nie, ale data tam jest. Może nie bardzo wygląda na datę, ale wartość 20031102000000.000000+000 – przypisana zmiennej strDate – oznacza właśnie 2 listopada 2003 r. Data wygląda tak dziwnie dlatego, że WMI korzysta z formatu UTC (Universal Time Coordinate – Uniwersalny Czas Skoordynowany). W formacie tym dwie pierwsze cyfry (2003) oznaczają rok; dwie kolejne (11) oznaczają miesiąc; a dwie kolejne (02) - dzień. Innymi słowy, 20031102 to 02 11 2003.

Swoją drogą, sześć kolejnych cyfr oznacza godzinę, minutę i sekundę (w formacie 24 godzinnym; pozostawiliśmy tam zera ponieważ tak dokładny czas nas nie interesuje (tzn. nie poszukujemy plików utworzonych przed godziną, dajmy na to, 14:37 drugiego listopada 2003 r.). Sześć cyfr po kropce służy do określenia liczby milisekund; wartości te radzimy zawsze pozostawiać jako zera. I wreszcie, +000 oznacza przesunięcie względem czasu Greenwich. Dzięki miejscu na wpisanie przesunięcia możemy koordynować daty i czas na komputerach znajdujących się w różnych strefach czasowych (tym jednak nie będziemy się dzisiaj zajmować). Jeśli w miejscu na podanie przesunięcia wpiszemy +000, komputer pracować będzie w czasie lokalnym.

Czy koniecznie jest podanie daty i czasu w tym formacie? Owszem. W Windows 2000 i starszych wersjach Windows musisz wpisać te dane w taki sposób, jak zrobiliśmy to powyżej. W Windows XP i Windows 2003 istnieje jednak nowy obiekt WMI – SWbemDateTime – dzięki któremu datę można podać w amerykańskim formacie DD/MM/RRRR, czyli w naszym wypadku 11/2/2003. Data zostanie automatycznie przekonwertowana na format UTC.

Po przypisaniu daty zmiennej strDate pozostaje nam już tylko zwyczajny skrypt WMI wyszukujący pliki o właściwości CreationDate wcześniejszej niż drugi listopada 2003 r. Kiedy plik taki zostaje znaleziony, wyświetlana jest jego nazwa.

Ale przecież prosiłeś o skrypt który kasuje stare pliki. Jeśli naprawdę tego chcesz, to zastąp wiersz Wscript.Echo objFile.Name wierszem poniższym:

objFile.Delete

Dlaczego nie umieściliśmy tego wiersza od razu w skrypcie? No cóż, chcieliśmy, abyś przed jego uruchomieniem chwilę pomyślał. Załóżmy, że na komputerze masz jeden dysk twardy, oznaczony jako C:. Czy na pewno chciałbyś usunąć z niego wszystkie pliki utworzone przed drugim listopada 2003 r.? Przecież w ten sposób usunięta zostałaby większa część systemu operacyjnego i programów. Czyli coś, czego raczej byś nie chciał.

Oznacza to, że wyszukując plików trzeba poczynać sobie nieco sprytniej. Załóżmy że Twój komputer ma dwa napędy: na dysku C: znajduje się system operacyjny i aplikacje, na dysku D: przechowujesz dokumenty. W takim wypadku mógłbyś napisać zapytanie WQL, które wyszukiwałoby plików utworzonych przed drugim listopada 2003 r. jedynie na dysku D:

strDate = "20031102000000.000000+000"



strComputer = "."

Set objWMIService = GetObject _

    ("winmgmts:\\" & strComputer & "\root\cimv2")

Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _

        " AND Drive = 'D:'")

For Each objFile in colFiles

    Wscript.Echo objFile.Name

Next

Być może chcesz usunąć swoje stare dokumenty Worda. W takim razie należałoby wyszukać pliki z rozszerzeniem doc, utworzone przed drugim listopada 2003 r.:

strDate = "20031102000000.000000+000"



strComputer = "."

Set objWMIService = GetObject _

    ("winmgmts:\\" & strComputer & "\root\cimv2")

Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _

        " AND Extension = 'doc'")

For Each objFile in colFiles

    Wscript.Echo objFile.Name

Next

Jest wiele sposobów, by dodać więcej kryteriów wyszukiwania; szczegółowe informacje na ten temat znajdziesz w rozdziale poświęconym plikom i folderom (j.ang.) w przewodniku skryptowania Microsoft Windows 2000.

A swoją drogą, często pytacie nas czy możliwe jest wyszukiwanie plików w oparciu o datę modyfikacji. Oczywiście że tak. Wystarczy wziąć któryś z poprzednich skryptów i zamiast CreationDate wpisać LastModified. Innymi słowy:

strDate = "20031102000000.000000+000"



strComputer = "."

Set objWMIService = GetObject _

    ("winmgmts:\\" & strComputer & "\root\cimv2")

Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_DataFile Where LastModified < '" & strDate & "'")

For Each objFile in colFiles

    Wscript.Echo objFile.Name

Next

Do początku stronyDo początku strony

 


Centrum skryptów - Systemy operacyjne