Monitorowanie dostępności hostów w Powershell

Dzień dobry wszystkim, chcę podzielić się prostą instrukcją „Jak przestać ręcznie pingować dziesięć hostów. Bez rejestracji i SMS!”

Monitorowanie dostępności hostów w PowershellZ zakątków Internetu

Ważne: nie jestem programistą ani administratorem systemów, ale muszę jednocześnie pracować z dużą liczbą serwerów usług i ten skrypt napisałem dla własnej wygody.

Wszystkich, którym może to się przydać, zapraszam pod kat.

Dlaczego PowershellMam doświadczenie w pisaniu prostych programów w Pythonie, ale wymaga to zainstalowanego interpretera lub praw do uruchamiania .exe, co w ramach mojej pracy nie zawsze jest możliwe. Z kolei skrypt na Powershell często udaje się uruchomić.

Nie wszyscy lubią konsolę/terminal

Myślę, że w tym nie ma sprzeczności, w przeciwnym razie wszyscy do dziś korzystali by z konsolowych klientów pocztowych, a w systemach *nix nie pojawiłby się GUI.

Ponieważ na co dzień muszę używać Powershell dość prymitywnie, na początek próbowałem zrozumieć, czy można do niego dodać GUI. Okazuje się, że można, i to dosyć łatwo:

Monitorowanie dostępności hostów w Powershell

Add-Type -assembly System.Windows.Forms # Podłączamy bibliotekę
$main_form = New-Object System.Windows.Forms.Form # Tworzymy obiekt z naszym "oknem"

# Ustawiamy dla niego parametry
$main_form.Text ='Links up' # Nazwa w tytule
$main_form.Width = 300 # Szerokość okna
$main_form.Height = 200 # Wysokość okna
$main_form.AutoSize = $true # Dajemy mu możliwość samodzielnej zmiany rozmiaru, w razie potrzeby
$main_form.ShowDialog() # Wywołujemy "okno"

Dodajemy do tego element wyjścia i uzyskujemy elementarne okno Windwows — tautologia?

Monitorowanie dostępności hostów w Powershell

Add-Type -assembly System.Windows.Forms #Łączymy bibliotekę

$main_form = New-Object System.Windows.Forms.Form #Tworzymy zmienną z naszym "oknem"

#Ustawiamy dla niego parametry
$main_form.Text ='Links up' #Nazwa w nagłówku
$main_form.Width = 300 #Szerokość okna
$main_form.Height = 200 #Wysokość okna
$main_form.AutoSize = $true #Pozwalamy mu na automatyczne zmienianie rozmiaru, jeśli to konieczne

$Label = New-Object System.Windows.Forms.Label #Wszystkie elementy formularza będą umieszczane w zmiennych, ale w rzeczywistości są to obiekty, jak każda inna zmienna w Powershell
$Label.Text = "Cześć! Jestem prostym oknem Windows, a co Ty osiągnąłeś?" #Wyświetlany tekst
$Label.Location  = New-Object System.Drawing.Point(10,65) #Położenie obiektu wewnątrz formularza w poziomie i pionie (x,y)
$Label.AutoSize = $true 

$main_form.Controls.Add($Label) #Dodajemy stworzony obiekt do formularza, aby nie zginął podczas wykonywania skryptu

$main_form.ShowDialog() #Wywołujemy proste okno

Dodajmy dynamiki

To narzędzie, którym "pingowałem Yandex" i montowałem *.iso, zyskało odrębny GUI, ale to niewystarczające. W podobny sposób można wyświetlić informację o dostępności, ale do monitorowania trzeba będzie za każdym razem uruchamiać skrypt na nowo.

Na początek narysujmy dwie ikony i dodajmy możliwość wyświetlania obrazów.

Monitorowanie dostępności hostów w Powershell

$PictureBox = New-Object system.Windows.Forms.PictureBox # Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)

# Tutaj przechodzimy do rzeczy, przypinamy wyświetlany obrazek do wyniku sprawdzenia dostępności węzła przy użyciu polecenia
#<b>test-connection</b>, gdzie:
#-Count - przekazuje liczbę żądań
#-computer - adres IP lub nazwa domeny dla żądania
#-quiet - aby zwrócić nam tylko wartość Boolean
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
	$PictureBox.imageLocation = "C:Testyes.png" # Obiekt odwołuje się do odpowiedniego obrazka 
}
Else {
	$PictureBox.imageLocation = "C:Testno.png" # Obiekt odwołuje się do odpowiedniego obrazka 
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$main_form.Controls.Add($PictureBox)

Znowu nasze DNS-y szaleją...

Monitorowanie dostępności hostów w Powershell
Dodamy jeszcze przycisk, aby mieć możliwość aktualizowania odczytów.

Monitorowanie dostępności hostów w Powershell

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(100,150) 
$Button.Size = New-Object System.Drawing.Size(80,30)
$Button.Text = "Reload"

# Przypisujemy zdarzenie kliknięcia przycisku do każdego PictureBox zgodnie z wcześniej opisaną logiką
$Button.Add_Click({ 
	if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True)
		{$PictureBox.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox.imageLocation	= "C:Testno.png"}
	  
	if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True)
		{$PictureBox1.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox1.imageLocation	= "C:Testno.png"}
 	})

$main_form.Controls.Add($Button)

Monitorowanie dostępności hostów w Powershell

Wspaniale, teraz do produkcji!?

Ręcznie wpisując około pół tuzina hostów, nagle zdałem sobie sprawę z jednej rzeczy — ten projekt się skończy, hosty się zmienią i będę musiał za każdym razem edytować skrypt. Z jednej strony nic wielkiego, to przecież rozwiązanie dla mnie samego. Z drugiej strony, zwróćcie uwagę na to, co się dzieje:

Widok nie dla słabych nerwów

Add-Type -assembly System.Windows.Forms #Ładowanie biblioteki

$main_form = New-Object System.Windows.Forms.Form #Tworzymy zmienną dla naszego "okna"

#Ustawiamy dla niego parametry
$main_form.Text ='Links up' #Tytuł okna
$main_form.Width = 300 #Szerokość okna
$main_form.Height = 200 #Wysokość okna
$main_form.AutoSize = $true #Pozwalamy mu na automatyczne zmienianie rozmiaru, jeśli to konieczne

$Label = New-Object System.Windows.Forms.Label #Wszystkie elementy formularza będą przechowywane w zmiennych, ale to w rzeczywistości są obiekty, jak każda inna zmienna w Powershell
$Label.Text = "ya.ru		............................" #Tekst do wyświetlenia
$Label.Location  = New-Object System.Drawing.Point(15,10) #Lokalizacja obiektu w formularzu w poziomie i w pionie (x,y)
$Label.AutoSize = $true

$Label1 = New-Object System.Windows.Forms.Label #Wszystkie elementy formularza będą przechowywane w zmiennych, ale to w rzeczywistości są obiekty, jak każda inna zmienna w Powershell
$Label1.Text = "8.8.8.8		............................" #Tekst do wyświetlenia - DNS Google'a
$Label1.Location  = New-Object System.Drawing.Point(15,30) #Lokalizacja obiektu w formularzu w poziomie i w pionie (x,y)
$Label1.AutoSize = $true

$Label2 = New-Object System.Windows.Forms.Label
$Label2.Text = "192.168.x.x	............................"
$Label2.Location  = New-Object System.Drawing.Point(15,50)
$Label2.AutoSize = $true

$Label3 = New-Object System.Windows.Forms.Label
$Label3.Text = "192.168.x.x	............................"
$Label3.Location  = New-Object System.Drawing.Point(15,70)
$Label3.AutoSize = $true

$Label4 = New-Object System.Windows.Forms.Label
$Label4.Text = "10.0.x.x	 ............................"
$Label4.Location  = New-Object System.Drawing.Point(15,90)
$Label4.AutoSize = $true

$Label5 = New-Object System.Windows.Forms.Label
$Label5.Text = "162.102.x.x	 ............................"
$Label5.Location  = New-Object System.Drawing.Point(15,110)
$Label5.AutoSize = $true

$PictureBox = New-Object system.Windows.Forms.PictureBox #Obiekt do wyświetlania obrazów ma logiczną nazwę
$PictureBox.width = 10
$PictureBox.height = 10

#Tutaj przechodzimy do rzeczy, powiązujemy wyświetlany obrazek z wynikiem sprawdzenia dostępności węzła przy użyciu polecenia
#<b>test-connection</b>, gdzie:
#-Count - przekazuje liczbę żądań
#-computer - adres IP lub nazwa domeny do zapytania
#-quiet - aby uzyskać tylko wartość Boolean
$PictureBox.location = New-Object System.Drawing.Point(235,12)
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
	$PictureBox.imageLocation = "C:Testyes.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
Else {
	$PictureBox.imageLocation = "C:Testno.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox1 = New-Object system.Windows.Forms.PictureBox # Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox1.width = 10
$PictureBox1.height = 10
$PictureBox1.location = New-Object System.Drawing.Point(235,32)
if ((test-connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True) {
	$PictureBox1.imageLocation = "C:Testyes.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
Else {
	$PictureBox1.imageLocation = "C:Testno.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox2 = New-Object system.Windows.Forms.PictureBox # Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox2.width = 10
$PictureBox2.height = 10
$PictureBox2.location = New-Object System.Drawing.Point(235,52)
if ((test-connection -Count 1 -computer 192.168.x.x -quiet) -eq $True) {
	$PictureBox2.imageLocation = "C:Testyes.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
Else {
	$PictureBox2.imageLocation = "C:Testno.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox3 = New-Object system.Windows.Forms.PictureBox # Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox3.width = 10
$PictureBox3.height = 10
$PictureBox3.location = New-Object System.Drawing.Point(235,72)
if ((test-connection -Count 1 -computer 192.168.x.x -quiet) -eq $True) {
	$PictureBox3.imageLocation = "C:Testyes.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
Else {
	$PictureBox3.imageLocation = "C:Testno.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox4 = New-Object system.Windows.Forms.PictureBox # Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox4.width = 10
$PictureBox4.height = 10
$PictureBox4.location = New-Object System.Drawing.Point(235,92)
if ((test-connection -Count 1 -computer 10.0.x.x -quiet) -eq $True) {
	$PictureBox4.imageLocation = "C:Testyes.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
Else {
	$PictureBox4.imageLocation = "C:Testno.png" # Obiekt odnosi się do odpowiedniego obrazu 
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$PictureBox5 = New-Object system.Windows.Forms.PictureBox # Obiekt do wyświetlania obrazów nazywa się całkiem logicznie
$PictureBox5.width = 10
$PictureBox5.height = 10
$PictureBox5.location = New-Object System.Drawing.Point(235,112)
if ((test-connection -Count 1 -computer 162.102.x.x -quiet) -eq $True) {
	$PictureBox5.imageLocation = "C:Testyes.png" # Obiekt odnosi się do odpowiedniego obrazu 
	}
Else {
	$PictureBox5.imageLocation = "C:Testno.png" # Obiekt odnosi się do odpowiedniego obrazu 
	}
$PictureBox5.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(100,150) 
$Button.Size = New-Object System.Drawing.Size(80,30)
$Button.Text = "Przeładuj"

# Podpinamy do zdarzenia kliknięcia przycisku odniesienie do każdego PictureBox zgodnie z wcześniej opisaną logiką
$Button.Add_Click({ 
	if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True)
		{$PictureBox.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox.imageLocation	= "C:Testno.png"}
	  
	if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True)
		{$PictureBox1.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox1.imageLocation	= "C:Testno.png"}

	if ((Test-Connection -Count 1 -computer 192.168.x.x -quiet) -eq $True)
		{$PictureBox2.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox2.imageLocation	= "C:Testno.png"}

	if ((Test-Connection -Count 1 -computer 192.168.x.x -quiet) -eq $True)
		{$PictureBox3.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox3.imageLocation	= "C:Testno.png"}

	if ((Test-Connection -Count 1 -computer 10.0.x.x -quiet) -eq $True)
		{$PictureBox4.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox4.imageLocation	= "C:Testno.png"}

	if ((Test-Connection -Count 1 -computer 162.102.x.x -quiet) -eq $True)
		{$PictureBox5.imageLocation	= "C:Testyes.png"}
	Else {$PictureBox5.imageLocation	= "C:Testno.png"}
	})

$main_form.Controls.Add($Label) #dodajemy utworzony obiekt do formularza, aby nie zginął podczas wykonywania skryptu
$main_form.Controls.Add($Label1)
$main_form.Controls.Add($Label2)
$main_form.Controls.Add($Label3)
$main_form.Controls.Add($Label4)
$main_form.Controls.Add($Label5)
$main_form.Controls.Add($PictureBox)
$main_form.Controls.Add($PictureBox1)
$main_form.Controls.Add($PictureBox2)
$main_form.Controls.Add($PictureBox3)
$main_form.Controls.Add($PictureBox4)
$main_form.Controls.Add($PictureBox5)
$main_form.Controls.Add($Button)

$main_form.ShowDialog() # Wywołujemy elementarne okno dialogowe

Nawet przestrzegając czystości i trzymając się struktury, okresowa edycja wywołuje niezbyt przyjemne odczucia.

Na początek wyodrębniamy sprawdzenie dostępności do osobnej funkcji, a ścieżkę do katalogu do osobnej zmiennej:

$script_path	= "C:TestPS ping"

#Przechodzimy do funkcji z już utworzonym obiektem PictureBox i adresem IP, który należy sprawdzić.
#Na wyjściu zmienia ładowany obrazek.
function get_status($PictureBox,$path_ip) {
	if ((Test-Connection -Count 1 -computer $path_ip -quiet) -eq $True)
		{$PictureBox.imageLocation	= $script_path + "yes.png"}
	Else {$PictureBox.imageLocation	= $script_path + "no.png"} 
	}

Wyodrębnimy dane o hoście do zewnętrznego pliku path.txt, zapisując w postaci „ip/host-funkcjonalna-nazwa/”, a w dokumencie przyjmiemy je w tablicach. Uczyńmy także obliczanie pozycji w osi Y bardziej zautomatyzowanym. Wszystko to daje nam możliwość tworzenia Label i checkboxów przez wywołanie funkcji:

Monitorowanie dostępności hostów w Powershell

#создаем описательную линию, на вход идут: объект Label, IP-адресс, описание и позиция по оси Y
Function Create_line($label,$path_ip,$caption, $top){ 
	$label.Location = New-Object System.Drawing.Point(1, $top)
	$label.text = $path_ip+$caption
	$label.font = $font
	$Label.AutoSize = $true
	}
#создаем индикатор для описательной линию, на вход идут: объект PictureBox, IP-адресс и позиция по оси Y
Function Create_link($PictureBox,$path_ip, $top){ 
	$PictureBox.width	= 10
	$PictureBox.height	= 10
	$PictureBox.location	= New-Object System.Drawing.Point(210,$top)
	get_status -PictureBox $PictureBox -path_ip $path_ip
	$PictureBox.SizeMode	= [System.Windows.Forms.PictureBoxSizeMode]::zoom
	}

$line = Get-content -LiteralPath $script_path"path.txt" #вытаскиваем данные о необходимых хостах
$len = $line.Length	#вычисляем длину, а точнее массив длин каждой строки

$i = 0

#далее объявляем массивы которые понадобятся дальше
$ip = @()	#массив ip
$capt = @()	#массив описания
$Labels =@()	#массив Label
$PictureBoxs =@()	#массив PictureBox

while($i -lt $len){
	$f = $line[$i].IndexOf("/") #вычисляем позицию начала описания
	$l = $line[$i].LastIndexOf("/")	#вычисляем позицию конца описания
	$ip += $line[$i].Substring(0,$f)	#вытаскиваем ip
	$capt += $line[$i].Substring($f+1,$l-$f-1)	#вытаскиваем описание

	#создаем поле Label
	Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
	#создаем поле PictureBox
	Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top

	$label_from_top += 15	#делаем "шаг" по оси Y

	$Labels	+= $label_obj	#вносим созданный Label в общий массив
	$PictureBoxs	+= $PictureBox_obj	#вносим созданный PictureBox в общий массив
	$main_form.Controls.Add($Labels[$i])
	$main_form.Controls.Add($PictureBoxs[$i])
	$i	+=1
	}

Dodamy miejsce na wyświetlenie czasu ostatniego sprawdzenia, ponieważ jest to wygodne, a także trochę wzbogacimy działanie po naciśnięciu przycisku.

Monitorowanie dostępności hostów w Powershell

$Label0	= New-Object System.Windows.Forms.Label
$Label0.Text	= Get-Date
$Label0.Location	= New-Object System.Drawing.Point(80,180)
$Label0.AutoSize	= $true
$main_form.Controls.Add($Label0)
$Button.Add_Click({ 
	while($i -lt $len){
		get_status -PictureBox $PictureBoxs[$i] -path_ip $ip[$i]
		$i +=1
		}
	$Label0.Text	= Get-Date 
	})

Dodałem także małą funkcjonalność, która przy wykryciu niedostępnego hosta informowała nie tylko przez zmianę wskaźnika, ale także krzyczała z głośników.

Add-Type -AssemblyName System.Speech
$voice	= New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate	= 5
$voice.Speak("Uwaga! Uwaga! Serwer jest atakowany!")

Tak więc po kilku ozdobnikach i doprowadzeniu do czytelnego i wygodnego wyglądu, wyszło to tak:

Pełny kod skryptu

Add-Type -AssemblyName System.Speech
Add-Type -assembly System.Windows.Forms

$script_path	= "C:PS ping"
$label_from_top	= 10
$voice	= New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate	= 5

#Przechodzimy do funkcji, aby uzyskać istniejący obiekt PictureBox oraz adres IP, który należy sprawdzić.
#Na wyjściu zmienia przetwarzaną grafikę.
function get_status($PictureBox,$path_ip) {
	if ((Test-Connection -Count 1 -computer $path_ip -quiet) -eq $True) {
		$PictureBox.imageLocation	= $script_path + "yes.png"
		}
	Else {
		$PictureBox.imageLocation	= $script_path + "no.png"
		$voice.Speak("Błąd! Host " + $path_ip + ", niedostępny!")
		}
	}

#Tworzymy linię opisującą, wejście: obiekt Label, adres IP, opis i pozycja w osi Y
Function Create_line($label,$path_ip,$caption, $top){ 
	$label.Location	= New-Object System.Drawing.Point(1, $top)
	$label.text	= $path_ip+$caption
	$label.font	= $font
	$Label.AutoSize	= $true
	}

#Tworzymy wskaźnik dla linii opisowej, wejście: obiekt PictureBox, adres IP i pozycja w osi Y
Function Create_link($PictureBox,$path_ip, $top){ 
	$PictureBox.width	= 10
	$PictureBox.height	= 10
	$PictureBox.location	= New-Object System.Drawing.Point(210,$top)
	get_status -PictureBox $PictureBox -path_ip $path_ip
	$PictureBox.SizeMode	= [System.Windows.Forms.PictureBoxSizeMode]::zoom
	}

$main_form	= New-Object System.Windows.Forms.Form
$main_form.Text ='Linki aktywne' #Nazwa w nagłówku
$main_form.Width = 300 #Szerokość okna
$main_form.Height = 200 #Wysokość okna
$main_form.AutoSize = $true #Dajemy mu możliwość samodzielnej zmiany rozmiaru, jeśli to potrzebne
$main_form.TopMost	= $true #To bardzo ważna rzecz, która pozwala przypiąć okno nad innymi

$line = Get-content -LiteralPath $script_path"path.txt" #Łatamy dane o wymaganych hostach
$len = $line.Length	#Obliczamy długość, a dokładniej tablicę długości każdej linii

$i = 0

#Następnie ogłaszamy tablice, które będą potrzebne dalej
$ip	= @()	#tablica IP
$capt	= @()	#tablica opisu
$Labels	=@()	#tablica Label
$PictureBoxs	=@()	#tablica PictureBox

while($i -lt $len){
	$f	= $line[$i].IndexOf("/") #Obliczamy pozycję początku opisu
	$l	= $line[$i].LastIndexOf("/")	#Obliczamy pozycję końca opisu
	$ip	+= $line[$i].Substring(0,$f)	#Wydobywamy IP
	$capt	+= $line[$i].Substring($f+1,$l-$f-1)	#Wydobywamy opis

	#Tworzymy pole Label
	Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
	#Tworzymy pole PictureBox
	Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top

	$label_from_top	+= 15	#Robimy "krok" w osi Y

	$Labels	+= $label_obj	#Dodajemy utworzony Label do ogólnej tablicy
	$PictureBoxs	+= $PictureBox_obj	#Dodajemy utworzony PictureBox do ogólnej tablicy
	$main_form.Controls.Add($Labels[$i])
	$main_form.Controls.Add($PictureBoxs[$i])
	$i	+=1
}

#To pole z ostatnim czasem sprawdzenia
$Label0	= New-Object System.Windows.Forms.Label
$Label0.Text	= Get-Date
$Label0.Location	= New-Object System.Drawing.Point(80,180)
$Label0.AutoSize	= $true


# Podpinamy do zdarzenia kliknięcia przycisku odwołanie każdego PictureBox zgodnie z wcześniej opisaną logiką
$Button	= New-Object System.Windows.Forms.Button
$Button.Location	= New-Object System.Drawing.Size(100,200)
$Button.Size	= New-Object System.Drawing.Size(80,30)
$Button.Text	= "Przeładuj"

$Button.Add_Click({ 
	while($i -lt $len){
		get_status -PictureBox $PictureBoxs[$i] -path_ip $ip[$i]
		$i	+=1
		}
	$i	= 0
	$Label0.Text	= Get-Date 
})

$main_form.Controls.Add($Button)
$main_form.Controls.Add($Label0)

$main_form.ShowDialog()

Epilog

Mam nadzieję, że ten tutorial będzie przydatny dla kogoś. Jeśli jednak robiłeś coś takiego od małego, to gratuluję, ja tego nie robiłem. Ale jestem gotów wysłuchać twoich komentarzy i sugestii.

Dla mnie samego było miło poszukać i złożyć taką małą, ale użyteczną w codziennym życiu aplikację. W planach mam jeszcze zrealizowanie możliwości dodawania i usuwania węzłów z GUI, a także wprowadzenie tego, co powinno być zrobione przede wszystkim — automatyczne aktualizowanie statusów bez potrzeby „klikania” przycisku i żeby nie zawieszało „powershell.exe”.

Ostatnia wersja skryptu na GitHub

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster