Zabawy z plikami
Założyliśmy, że nazwy plików, które skrypt ma automatycznie przenieść do odpowiednich folderów, wyglądają np. tak: plik200601.jpg, plik200602.jpg, plik200701.jpg… itd. Istotne jest przede wszystkim to, by rok „zaszyty” w nazwie był reprezentowany przez cztery cyfry (i żeby w nazwie nie było dwóch liczb czterocyfrowych).
Do przeprowadzenia za pomocą tworzonego skryptu działań na plikach można wykorzystać zarówno obiekt FileSystemObject (pozwalający odwołać się z poziomu skryptu do elementów systemu plików), jak i usługę WMI (Windows Management Instrumentation – Instrumentacja Zarządzania Windows). Zdecydowaliśmy się na drugie, bardziej uniwersalne rozwiązanie, które m.in. umożliwia zdalne wykonywanie skryptu.
Stąd też wynika pojawienie się zmiennej strComputer w linii 1 kodu. Domyślnie, między cudzysłowami znajduje się znak kropki. Oznacza to, że działania skryptu będą dotyczyły komputera lokalnego (tego, na którym skrypt jest uruchamiany). Wystarczy jednak, że zmodyfikujesz ten wiersz i wprowadzisz np. zapis:
strComputer = „komputer01”
Będzie to oznaczało, że skrypt zostanie wykonany na maszynie o nazwie „komputer01”, znajdującej się w twojej sieci lokalnej.
W linii 3 pojawia się dziwny zapis – \root\cimv2. Czy chodzi o coś wspólnego z Linuksem (root to nazwa użytkownika administracyjnego w systemach linuksowych)? Nie w tym przypadku. Dane z usługi WMI można pobierać za pomocą tzw. kwerend (czyli zapytań kierowanych do bazy danych). Każda z kwerend jest wykonywana w konkretnym obszarze nazw dla usługi WMI. Powyższy zapis jest właśnie domyślną przestrzenią nazw dla usługi WMI. Pozostała część linii 3 powinna być zrozumiała. To po prostu utworzenie obiektu objWMIService, za którego pomocą skrypt będzie mógł „odpytywać” WMI odnośnie odpowiednich danych.
Linie od 5 do 7 to utworzenie kolekcji danych (w naszym przykładzie – plików) za pomocą kwerendy ASSOCIATORS OF (jest to jedna z kwerend usługi WMI). Na razie skrypt jeszcze nie analizuje nazw, lecz pobiera wszystkie pliki (wystąpienia klasy CIM_DataFile) znajdujące się w folderze C:\Test. Oczywiście, jeżeli chcesz, by skrypt zadziałał na innym folderze, zmień widoczną w linii 6 ścieżkę.
Linia 9 to utworzenie wystąpienia obiektu VBScript.RegExp, dzięki któremu skrypt będzie mógł wyszukać wyrażenia regularne (tu: lata) w nazwach plików.
Linie od 11 do końca skryptu zajmuje znana ci już z poprzednich odcinków konstrukcja – pętla For Each…Next. W liniach 12 i 13 następuje przypisanie wartości dwóch właściwości utworzonego w linii obiektu wyrażeń regularnych (VBScript.RegExp). Poprzez ustawienie właściwości Global na wartość True powodujesz, że skrypt wyszuka wszystkie wystąpienia danego wzoru (w naszym przykładzie – czterocyfrowej liczby oznaczającej rok). Z kolei właściwość Pattern (z ang. wzór) to po prostu szukana wartość. Oczywiście lat w nazwach pliku nie szukamy poprzez dosłowne wartości (z założenia nie wiadomo, jakie one są). Dlatego też używa się zwrotu \d{4} będącego składnią wyrażenia regularnego dla czterech cyfr.
W linii 15 następuje przypisanie nazwy pierwszego pliku z kolekcji do zmiennej strSearchString. W kolejnej, 16 linii za pomocą metody Execute wyszukiwane są nazwy pliku dla wszystkich wystąpień wzoru (czterocyfrowego roku). Znalezione wyniki zostaną zapisane do kolekcji colMatches.
W linii 18 do zmiennej strYear zostaje przypisany pierwszy (o indeksie 0) element (wartość Value) kolekcji colMatches. W ten sposób skrypt „poznaje” rok zaszyty w nazwie pliku.
Linie od 20 do 23 to już działania bezpośrednio na plikach. Najpierw tworzona jest – za pomocą zmiennej strNewFile – nowa ścieżka zapisu (wraz z nazwą pliku i rozszerzeniem), a w kolejnych dwóch liniach wykonywane są operacje – najpierw kopiowania, a następnie kasowania z lokalizacji źródłowej. Czemu tak? Wynika to z braku metody przenoszenia plików w usłudze WMI.
Ostatnia linia – 24 – to powrót na początek pętli. Będzie ona powtarzana tak długo, dopóki będą elementy w kolekcji colFiles. Uwaga! Skrypt ten zakłada, że docelowe foldery (z numerami lat w nazwach) już istnieją i są podfolderami foldera z linii 6 (czyli C:\Test). Jeżeli chcesz poznać sposób tworzenia folderów przez skrypt, zapoznaj się z kolejnym skryptem.