Pchełki Powershell: proste logowanie z cherbatką

https://xpil.eu/kau

Ja wiem, że jestem z dolnych okolic ujemnego IQ, ale żeby "herbatka" napisać przez ce-ha?

Zaraz się wyjaśni.

Czasem mamy do napisania skrypt w Powershell. I nie jednolinijkowy, który kopiuje plik z folderu A do folderu B, tylko taki bardziejszy. Taki, co to i do bazy danych się podłączy, i do jakiegoś webserwisu na ten przykład, a to w rejestrze grzebnie, a to jakiegoś CSS-a czy HTML-a wygeneruje, czy co tam jeszcze kto potrzebuje. No taki bardziejszy.

A jak powszechnie wiadomo[citation needed] czym bardziej bardziejszy skrypt tym większe szanse na popełnienie błędu. A skoro będą błędy to już na dzień dobry warto pomyśleć o jakimś systemie logowania różnych informacji do pliku. Albo chociaż na ekran. A najlepiej jedno i drugie.

Do tego jeszcze żeby było prosto i szybko.

Powershell ma filtry.

A cebula ma warstwy i co z tego? Jakie, kurna, znów filtry? O co temu gościowi znów qu'est-ce que c'est?

Filtr w Powershellu to nic innego jak funkcja bez argumentów, którą można "karmić" danymi wyłącznie przez rurkę.

Czyli po naszemu pipe.

O, tak wygląda rurka: |

A tak wyglądają dwie rurki obok siebie: ||

Użytkownicy linuksów są z rurką obeznani, bo tam bez rurki się w zasadzie nie da. Windowsiarze przebrzydli może też wiedzą, co to rurka. A może nie...

Rurka działa o, tak:

jakaś-komenda | jakaś-inna-komenda

Działa to w ten sposób, że dane wygenerowane przez pierwszą komendę (tę po lewej stronie rurki) są wysyłane do drugiej komendy (tej po prawej stronie).

Na przykład:

dir | sort

Powyższe wykona najpierw polecenie dir (czyli wylistowanie wszystkich plików i katalogów w bieżącym miejscu) a następnie zamiast wywalić to na ekran, wyśle do polecenia sort, które - niespodzianka - posortuje te nasze pliki i katalogi alfabetycznie i dopiero wtedy wyświetli na ekranie, posortowane. Chyba że za sort umieścimy kolejną rurkę, wtedy ta posortowana list plików i folderów trafi do kolejnego polecenia. I tak dalej. Można w ten sposób budować całkiem interesujące i zaawansowane mechanizmy przetwarzania danych.

Ale do rzeczy, moiściewi, do rzeczy, miało być o logowaniu i o debilach ortograficznych!

No dobra. Logowanie. Filtry. Lecimy:

Filter DoLog {
    $LogName = "$PSScriptRoot\log\$(Get-Date -Format 'yyyyMMdd').log"
    (Get-Date -Format "yyyyMMddhhmmss.fff ") + $_ | Tee-Object $LogName -Append
}

Od tej pory możemy w naszym skrypcie przepuszczać różne rzeczy przez DoLog, za pomocą rurki. Na przykład o tak:

"Bardzo Ważny Komunikat" | DoLog

Powyższa komenda wypisze na ekranie "Bardzo Ważny Komunikat", poprzedzony znacznikiem czasowym, a także wyśle ten sam komunikat do pliku 20191018.log w podfolderze [log] w lokalizacji naszego skryptu.

Fajne?

Fajne, tylko że nie zadziała, bo nie mamy folderu [log].

Ja z lenistwa zawsze tworzę ten folder ręcznie, ale można to zautomatyzować jak się komuś mocno chce. Mi się nie chce.

A co z tą nieszczęsną cherbatką?

Jeżeli przyjrzymy się treści naszego filtra DoLog zobaczymy tam polecenie Tee-Object, które działa analogicznie do linuksowego tee. Czyli kopiujemy (w locie) dane, jedna kopia ląduje na ekranie a druga - w pliku o podanej nazwie. Opcja -Append zaś zagwarantuje, że kolejne komunikaty będą dopisywane na koniec pliku czyli dokładnie tak, jak powinien działać log. "Tee" wygląda trochę jak "Tea" z błędem, stąd cherbatka.

Aha, $_ reprezentuje w Powershell "to", czyli w tym przypadku zawartość wylewającą się z rurki. A w innym przypadku - na przykład bieżący element iterowanej właśnie kolekcji, albo jeszcze coś innego. Ale to już może kiedy indziej.

https://xpil.eu/kau

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.