niedziela, 30 października 2022

PowerShell: zabawa z właściwościami obiektu

1. Filtrowanie właściwości obiektu wg fragmentu jego nazwy

W przypadku obiektów posiadających wiele właściwości przydaje się możliwość ich przeszukiwania wg fragmentu ich nazwy. Na przykład obiekt ma setki właściwości, ale chcemy wyświetlić wyłącznie te, które zawierają określone słowo.

WAŻNE!
Proszę zwrócić uwagę, że omawiane jest wyszukiwanie po nazwach właściwości, a nie ich wartościach.
Wyszukiwaniu po wartościach poświęcony jest punkt 2 tego wpisu.

Nazwy właściwości wyświetlane są po lewej stronie (na zielono), a ich wartości po prawej
Nazwy właściwości wyświetlane są po lewej (na zielono), a ich wartości po prawej stronie

Może to nie jest zbyt szczęśliwy wybór, ale przypuśćmy, że z komendy Get-Date chcemy wyświetlić wszystkie właściwości, które zawierają w swojej nazwie ciąg day.

czwartek, 28 kwietnia 2022

PowerShell: Generator adresów IP

Czasami zachodzi potrzeba wygenerowania listy adresów IP v4.
Powyższe kawałki kodu pozwalają na to. 
Obydwa robią to samo, z tym, że "wersja jednolinijkowa" może być uruchamiana zarówno z poziomu konsoli, jak i środowiska programistycznego, natomiast "Wersja do użycia w edytorze kodu" nie uruchomi się w konsoli. 
Można wybrać co komu potrzebne:
  • wersja jednolinijkowa jest bardziej wszechstronna, ale mniej czytelna, 
  • wersja czytelniejsza, ale do użycia tylko w edytorze kodu lub jako skrypt. 

Wersja jednolinijkowa

for ($i=1; $i -le 10; $i++){(Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString() + '.' + (Get-Random -Minimum 1 -Maximum 255).ToString()}
W miejsce zaznaczonej na czerwono cyfry 10 wystarczy podać swoją wartość i powyższy jednolinijkowiec wygeneruje taką właśnie liczbę adresów IP. 

IP list generator
Wynik działania komendy generującej adresy IP

Wersja do użycia w edytorze kodu

Poniższy kod także generuje listę adresów IP v4, ale został sformatowany do używania jako skrypt w środowisku oraz jest bardziej czytelny.
$howMuchShouldBeGenerated = 10 #ile adresów ma zostać wygenerowanych
$IPs = @()
for ($i=1; $i -le $howMuchShouldBeGenerated; $i++){
    $IP = ""
    for ($j=1; $j -le 4; $j++){
        $oktet = (Get-Random -Minimum 1 -Maximum 255).ToString()
        $IP += $oktet
            if ($j -le 3){
                $IP += "."
            }
    }
    $IPs += $IP
}
$IPs
Proste, ale może komuś się przyda. 

wtorek, 22 marca 2022

PowerShell: Monitorowanie stanu usługi w konsoli i do pliku

W celu rozwiązywania problemu z jakąś usługą, może się przydać prosty monitoring polegający na sprawdzaniu jej statusu w podanym interwale czasowym.

Poniższy jednolinijkowiec wykonuje takie właśnie zadanie.

$serviceName = 'nazwa_usługi'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)"}

W powyższym kodzie proszę zwrócić uwagę na miejsca oznaczone na czerwono. Oczywiście 'nazwa_uslugi' to nic innego jak nazwa usługi, którą chcemy monitorować (nazwy usług można podejrzeć np. poleceniem Get-Service).

Z kolei cyfra 5 oznacza interwał czasowy w sekundach pomiędzy sprawdzeniami. 

Rezultat jego działania widać poniżej. 


Oczywiście monitorowanie na ekranie może się przydać we w miarę krótkim przedziale czasowym. Jeżeli zachodzi potrzeba monitoringu dłuższego okresu czasu, wystarczy rezultat powyższej komendy przekierować do pliku dodając kod, który zamieściłem poniżej na czerwono.

$serviceName = 'spooler'; while ($TRUE) {start-sleep -Seconds 5; write-output "$(get-date -format "HH:mm:ss") : $((get-service -name $serviceName).Name) : $((get-service -name $serviceName).Status)" | Tee-Object -file plik.txt -append}

poniedziałek, 21 marca 2022

PowerShell: Przeszukiwanie plików w folderze (i ewentualnie podfolderach) pod kątem określonego ciągu znaków

Informacje wstępne

Poniżej wklejam prostą komendę w PowerShellu, która pozwoli przeszukać wszystkie pliki tekstowe w folderze pod kątem podanego ciągu znaków. 

Przydatne zwłaszcza kiedy w gąszczu logów trzeba znaleźć określoną frazę.

Komenda

Wersja przeszukująca wszystkie pliki w folderze

Get-ChildItem -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Wersja z ograniczeniem przeszukiwania do plików *.txt

Get-ChildItem *.txt -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Wersja z ograniczeniem przeszukiwania do plików *.txt i rekursywnym przeszukiwaniem podfolderów

Get-ChildItem *.txt -Recurse -File | ForEach-Object {Select-String -Path $_.FullName -Pattern 'daniel'}

Przykład działania

Do przeszukania poszły dwa pliki. Pierwszy ze słowami angielskimi, drugi z polskimi:

  • english_words_alpha.txt (link)
  • sjp.20220320.txt (link)
Obydwa znajdowały się w jednym folderze i chciałem w nich wyszukać wszelkie kombinacje mojego imienia, tj. "daniel". 

Użyłem komendy, która została podana powyżej, zaś poniżej screen przedstawiający rezultat obejmujący:
  • kolumna pierwsza: nazwa pliku,
  • kolumna druga: nr wiersza w którym ciąg został znaleziony,
  • kolumna trzecia: odnaleziony ciąg z wyróżnieniem szukanego tekstu.

Parsowanie plików w folderze pod kątem określonego ciągu
Wynik działania opisywanej komendy w PowerShellu

No i to w sumie tyle. Jedna linijka, a potrafi zaoszczędzić dużo czasu :)