Pchełki Powershell: proste logowanie z cherbatką

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.

Arranging connections…

Dodaj komentarz

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.