Jak i po co używać Tee-Object?

Od kiedy poznałem tytułową funkcję, zmodyfikowałem wiele skryptów które budowałem okrężną drogą. Nie jest to kluczowa funkcja w PowerShell, ale na pewno warta poznania, bo znacząco ułatwia zarządzanie skryptem. Zapraszam na głeboki skok do Tee-Object!

Na pewno wielu z Was pomyśli sobie „niezły archeolog, właśnie poznał coś co istnieje od dawna”. Chociaż sam z komendy korzystam od kilku lat, to inni administratorzy czasem robią wielkie oczy i pytają się „A co to robi?” – i to mnie skłoniło do popełnienia dzisiejszego wpisu. Każdy kiedyś zaczyna, a w tym wpisie postaram się zapełnić zebrać wszystkie istotne informacje na temat tego obiektu.

O Tee-Object możemy śmiało powiedzieć, że jest już całkiem leciwym staruszkiem, bo można go znaleźć już w PowerShell 2.0. W mojej skromnej opinii uważam, że jest to jedna z najbardziej niedocenianych komend. To takie narzędzie 2w1 – rzucasz raz, a trafiasz dwa cele. Dzięki zastosowaniu komendy skrypt będzie z pewnością czytelniejszy, ale czy będzie wydajniej? Postanowiłem to sprawdzić! Ale najpierw, wróćmy do zastosowania. Celem Tee-Object jest przekierowanie strumienia wyjściowego w dwie strony, dokładnie tak jak to można zobrazować literą „T” jak poniżej.

Jedna część takiego strumienia ląduje wprost na ekran naszej konsoli, drugą możemy przekierować do pliku albo do zmiennej i wykorzystać później. Przejdźmy może do przykładu. Musimy włączyć na jednym z serwerów dwa serwisy – Windows Update i klienta DNS. Chcemy też mieć migawkę serwisów przed uruchomieniem powyższych. W tradycyjnym podejściu moglibyśmy zrobić coś takiego:

Tradycyjne podejście

Spróbujmy wykonać tę same czynności włączając Tee-Object:

Powiew „nowoczesności”

Wszystko przechodzi przez potok. W dodatku jeśli nie chcemy nadpisać pliku, a do niego dopisać, wystarczy dodać parametr -Append. I w zasadzie zrobił się z tego one-liner 😊

Użycie Tee-Object ze zmienną

Zmieńmy zatem nieco użycie – zamiast do pliku przekierujmy wyjście na zmienną. Zobaczmy co się stanie:

Błąd? Ten Tee-Object jest do …

Ale skąd pojawił się błąd? Wynika to ze specyfiki działania tego polecenia. Przekazując jako parametr zmienną, powinniśmy podać jej nazwę bez znaku '$’. Spróbujmy więc jeszcze raz:

A jednak działa!

Czy z Tee-Object mój skrypt będzie działał szybciej?

Teraz czas na obiecane sprawdzenie wydajności, czyli czy ma to oprócz subiektywnych odczuć jakiekolwiek korzyści. Dla tych celów zostanie uruchomiony krótki skrypt sprawdzający, czy Tee-Object umożliwia optymalizację, a jeśli tak, to o ile. Skrypt wykorzystany do testów znajduje się poniżej:

$resultList = New-Object System.Collections.ArrayList
$resultListTee = New-Object System.Collections.ArrayList
for($i=0;$i -lt 10;$i++)
{
    $start = Get-Date
    $processes = Get-Process
    $processes
    $stop = Get-Date
    $interval = $stop - $start
    $resultList.Add($interval)
    $start = Get-Date
    Get-Process | Tee-Object -Variable processes
    $stop = Get-Date
    $interval = $stop = $start
    $resultListTee.Add($interval)
}

A więc zerknijmy na rezultaty z mojego komputera:

Wygląda niemal identycznie

Wrzućmy te wyniki do tabeli i porównajmy rezultaty:

Tee-Object 1 : 0 Tradycyjne podejście

Różnica minimalna na korzyść Tee-Object. Chcąc potwierdzić to zrobiłem badanie dla… 600 przebiegów i daruje sobie wklejać całą tabelę i dodam tylko podsumowanie. Całość zajęło ładnych parę minut…

A więc faktycznie jest lepiej!

Jak widać, im bardziej skomplikowany będzie Wasz skrypt, tym większe korzyści to przyniesie. Oczywiście, tylko w przypadku gdy chcecie mieć podgląd działań „na żywo”.

Czy trzeba korzystać z Tee-Object? Oczywiście, że nie. Jak do wszystkiego – trzeba się przekonać i podejść krytycznie. Ja korzystam z tej komendy regularnie w swoich skryptach, bo jest to dla mnie czytelniejsze, dodatkowo, zmniejsza ilość linii kodu w skrypcie. Zachęcam jednak do testowania i używania.

Marcin Kuchczyński

Wielki fan automatyzowania wszystkiego, co trzeba wykonać więcej niż 2 razy. Cierpliwie rozwijający się w kierunku rozwiązań chmurowych i raczkujący w sferze sztucznej inteligencji. W IT od 2016 roku.

Leave a Reply