Jak moi blogiści i bloginie zapewne kojarzą, od czasu do czasu wrzucam tutaj jakąs pchełkę. Pchełki na tym blogu to małe kawałki kodu pokazujące jak za pomocą konkretnej technologii rozwiązać konkretny (na ogół niewielki) problem.
Dawno temu opublikowałem cały cykl pchełek VBA - prawdę mówiąc, do dziś generują mi one ponad połowę ruchu na stronie. Ludzie ciągle używają VBA, uczą się tego języka i piszą w nim na potęgę, dzięki czemu mam jeszcze w ogóle jaką-taką oglądalność.
Oprócz tego mam też pchełki SQL, albowiem jako Bazyl z dziada-pradziada, używam SQL-a na co dzień i od święta, można mnie obudzić o wpół do czwartej nad ranem i będę w stanie podać składnię komendy UNPIVOT (o ile tylko będę miał trzy minuty oraz dostęp do google).
Była też nieśmiała próba opchełkowania Pythona, ale spełzła na niczym, ponieważ Pythona nie używam do żadnych celów (ani slużbowych, ani tym bardziej prywatnych). Skończyło się na trzech czy czterech pchełkach.
No a dziś nowy gracz na arenie pchełkowej, czyli Power Shell. Język skryptowy ze stajni Microsoftu, z koszmarnie nieczytelną składnią, nieintuicyjnymi poleceniami oraz mnóstwem udziwnień, które sprawiają, że czytanie kodu w Power Shell prostuje resztki zwojów między uszami. Niemniej jednak tak mi się przytrafiło ostatnimi czasy, że zacząłem używać PS (będę pisał PS zamiast Power Shell, bo jestem leniwy), a co za tym idzie powinienem od czasu do czasu trafiać na jakiś pchełkowy materiał.
Taka okazja właśnie się nadarzyła dziś. Od kilku dni pracuję nad projektem, którego jednym z elementów jest poprawna obsługa plików dziennika (zwanych lokalnie logami). W Linuksie mamy komendę logrotate, która w zasadzie załatwia wszelkie potrzeby w zakresie obsługi logów. W Windows takiej komendy nie ma, więc trzeba sobie coś napisać samemu.
Jednym z założeń projektu jest, że pliki dziennika mają być przechowywane przez X dni, a potem się zobaczy (archiwizacja bądź kasowanie, czyli archiwizacja do /dev/nul).
Ponieważ nie miałem do dyspozycji żadnych plików starszych niż X dni, postanowiłem je sobie naprodukować. Z tym, że z braku Total Commandera oraz bez możliwości instalowania jakiegokolwiek zewnętrznego oprogramowania (witamy w świecie zabezpieczeń korporacyjnych) musiałem sobie poradzić narzędziami, które miałem dostępne.
Najpierw pomyślałem o VBA / VBS, bo mi tak było wygodniej. Ale zaraz potem powiedziałem sobie stanowcze "hmmm" po czym stwierdziłem, że skoro projekt jest w PS to trzeba sobie poradzić za pomocą PS. No i sobie poradziłem.
Oto recepta na ustawienie dowolnego znacznika czasowego dowolnemu plikowi, do którego oczywiście mamy odpowiednie prawa dostępu. Za pomocą PS:
$(Get-Item "C:\sciezka\do\pliku.log").CreationDateTime=$(Get-Date "01/01/2001")
$(Get-Item "C:\sciezka\do\pliku.log").LastAccessDateTime=$(Get-Date "01/01/2001")
$(Get-Item "C:\sciezka\do\pliku.log").LastWriteDateTime=$(Get-Date "01/01/2001")
Jak widać metoda jest trywialna, wystarczy znać dwie metody: Get-Item oraz Get-Date. Składnia jest dość obrzydliwa, jednak po pewnym czasie człowiek się z nią oswaja i nawet zaczyna widzieć w niej namiastkę sensu.
Nie obiecuję, że uda mi się rozwinąć cykl pchełek Power Shell w coś więszego, ale z drugiej strony nie obiecywałem sobie, że będę kiedykolwiek blogował, tymczasem już czwarty rok leci i póki co końca nie widać.
A teraz zakasuję rękawy i wracam na zmywak.
Fuj jakie to brzydkie. Miałem na myśli pchelke
DGCC