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 :)