Salut tuturor, vreau să împărtășesc o instrucțiune simplă „Cum să încetezi să pingi manual zeci de host-uri. Fără înregistrare și SMS!”.
Din colțurile Internetului
Este important: nu sunt programator și nici administrator de sistem, dar mă ocup cu un set mare de servere și servicii și acest script l-am scris pentru conveniența mea personală.
Pentru toți cei cărora le-ar putea fi util, vă rog să urmăriți.
De ce PowershellAm experiență în scrierea unor programe simple în Python, dar acesta necesită fie un interpret instalat, fie drepturi de execuție .exe, ceea ce, în cadrul muncii mele, nu este întotdeauna posibil. Dar un script pe Powershell găsește adesea modalități de a fi lansat.
Nu toată lumea iubește consola/terminalul
Cred că nu este nicio contradicție, altfel toți am folosi clienți de email din consolă și în sistemele *nix nu ar fi apărut GUI.
Având în vedere că în viața de zi cu zi trebuie să folosesc Powershell destul de primitiv, am încercat mai întâi să înțeleg dacă pot să-i atașez un GUI. Se pare că se poate, și destul de simplu:

Add-Type -assembly System.Windows.Forms #Conectăm biblioteca
$main_form = New-Object System.Windows.Forms.Form #Creăm un obiect cu "fereastra" noastră
#Setăm parametrii pentru acesta
$main_form.Text ='Links up' #Numele din antet
$main_form.Width = 300 #Lățimea ferestrei
$main_form.Height = 200 #Înălțimea ferestrei
$main_form.AutoSize = $true #Îi oferim posibilitatea de a-și schimba dimensiunea, dacă este necesar
$main_form.ShowDialog() #Invocăm "fereastra"
Adăugăm un element de ieșire și obținem un elementar Windows-„fereastră” tautologie?.

Add-Type -assembly System.Windows.Forms #Importăm biblioteca
$main_form = New-Object System.Windows.Forms.Form #Cream o variabilă pentru "fereastra" noastră
#Setăm parametrii pentru aceasta
$main_form.Text ='Links up' #Numele în titlu
$main_form.Width = 300 #Lățimea ferestrei
$main_form.Height = 200 #Înălțimea ferestrei
$main_form.AutoSize = $true #Îi permitem să-și schimbe dimensiunea automat, dacă este necesar
$Label = New-Object System.Windows.Forms.Label #Toate elementele formularului vor fi stocate în variabile, dar de fapt sunt obiecte, ca orice alte variabile în Powershell
$Label.Text = "Salut! Eu sunt o fereastră Windows de bază, iar tu ce ai realizat?" #Textul afișat
$Label.Location = New-Object System.Drawing.Point(10,65) #Locația obiectului în interiorul formularului pe orizontală și verticală (x,y)
$Label.AutoSize = $true
$main_form.Controls.Add($Label) #adăugăm obiectul creat la formular, pentru a nu se pierde în timpul execuției scriptului
$main_form.ShowDialog() #Afișăm fereastra de bazăSă adăugăm dinamicitate
Acest instrument cu care am "pingat Yandex" și am montat *.iso a obținut o interfață GUI separată, dar asta nu e suficient. În mod similar, putem afișa informații despre disponibilitate, dar pentru monitorizare va trebui să reluăm scriptul de fiecare dată.
În primul rând, să desenăm două pictograme și să adăugăm posibilitatea de a afișa imagini.

$PictureBox = New-Object system.Windows.Forms.PictureBox #Obiectul pentru afișarea imaginilor este numit destul de logic
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)
#Aici trecem la subiect, legăm imaginea de ieșire la rezultatul verificării accesibilității nodului folosind cmdlet-ul
#<b>test-connection</b>, unde:
#-Count - transmite numărul de cereri
#-computer - IP sau numele domeniului pentru cerere
#-quiet - pentru a ne întoarce doar o valoare Boolean
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
$PictureBox.imageLocation = "C:Testyes.png" #Obiectul accesează imaginea corespunzătoare
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Obiectul accesează imaginea corespunzătoare
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$main_form.Controls.Add($PictureBox)
Din nou, DNS-urile noastre fac probleme...

Și să adăugăm un buton pentru a avea posibilitatea de a actualiza citirile.

$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 = "Reîncărcare"
# Atasăm la evenimentul de apăsare a butonului apelul fiecărui PictureBox conform logicii descrise anterior
$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)

Minunat, acum în producție!?
După ce am introdus manual aproximativ o duzină de host-uri, mi-am dat seama de un lucru — acest proiect se va termina, host-urile se vor schimba și va trebui să corectez scriptul de fiecare dată. Pe de o parte, nu este nimic grav, este o soluție pentru mine. Pe de altă parte, uitați-vă la ce se obține:
Un spectacol nu pentru cei slabi de inimă
Add-Type -assembly System.Windows.Forms #Conectăm biblioteca
$main_form = New-Object System.Windows.Forms.Form #Creăm variabila cu "fereastra" noastră
#Setăm parametrii pentru aceasta
$main_form.Text ='Links up' #Numele din antet
$main_form.Width = 300 #Lățimea feronsei
$main_form.Height = 200 #Înălțimea feronsei
$main_form.AutoSize = $true #Îi dăm posibilitatea de a-și schimba dimensiunea în mod automat, dacă este necesar
$Label = New-Object System.Windows.Forms.Label #Toate elementele formularului vor fi introduse în variabile, dar, de fapt, acestea sunt obiecte, ca orice alte variabile în Powershell
$Label.Text = "ya.ru ............................" #Textul afișat
$Label.Location = New-Object System.Drawing.Point(15,10) #Poziția obiectului în interiorul formularului pe orizontală și verticală (x,y)
$Label.AutoSize = $true
$Label1 = New-Object System.Windows.Forms.Label #Toate elementele formularului vor fi introduse în variabile, dar, de fapt, acestea sunt obiecte, ca orice alte variabile în Powershell
$Label1.Text = "8.8.8.8 ............................" #Textul afișat DNS google-istic
$Label1.Location = New-Object System.Drawing.Point(15,30) #Poziția obiectului în interiorul formularului pe orizontală și verticală (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 #Obiectul pentru afișarea imaginilor se numește foarte logic
$PictureBox.width = 10
$PictureBox.height = 10
#Aici trecem la subiect, legăm imaginea care va fi afișată de rezultatul verificării accesibilității nodului folosind cmdlet-ul
#<b>test-connection</b>, unde:
#-Count - transmite numărul de cereri
#-computer - IP sau numele de domeniu pentru cerere
#-quiet - pentru a ne returna doar valoarea 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" #Obiectul face referire la imaginea corespunzătoare
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Obiectul face referire la imaginea corespunzătoare
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox1 = New-Object system.Windows.Forms.PictureBox #Obiectul pentru a afișa imaginile se numește logic
$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" #Obiectul face referire la imaginea corespunzătoare
}
Else {
$PictureBox1.imageLocation = "C:Testno.png" #Obiectul face referire la imaginea corespunzătoare
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox2 = New-Object system.Windows.Forms.PictureBox #Obiectul pentru a afișa imaginile se numește logic
$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" #Obiectul face referire la imaginea corespunzătoare
}
Else {
$PictureBox2.imageLocation = "C:Testno.png" #Obiectul face referire la imaginea corespunzătoare
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox3 = New-Object system.Windows.Forms.PictureBox #Obiectul pentru a afișa imaginile se numește logic
$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" #Obiectul face referire la imaginea corespunzătoare
}
Else {
$PictureBox3.imageLocation = "C:Testno.png" #Obiectul face referire la imaginea corespunzătoare
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox4 = New-Object system.Windows.Forms.PictureBox #Obiectul pentru a afișa imaginile se numește logic
$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" #Obiectul face referire la imaginea corespunzătoare
}
Else {
$PictureBox4.imageLocation = "C:Testno.png" #Obiectul face referire la imaginea corespunzătoare
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox5 = New-Object system.Windows.Forms.PictureBox #Obiectul pentru a afișa imaginile se numește logic
$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" #Obiectul face referire la imaginea corespunzătoare
}
Else {
$PictureBox5.imageLocation = "C:Testno.png" #Obiectul face referire la imaginea corespunzătoare
}
$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 = "Reload"
# Asociem evenimentul de apăsare a butonului pentru a accesa fiecare PictureBox conform logicii descrise anterior
$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) #adăugăm obiectul creat la formular, astfel încât să nu se piardă în timpul execuției scriptului
$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() #Apelăm elementul fereastră de bază
Chiar dacă respectăm structura și menținem curățenia, editările periodice vor provoca senzații neplăcute.
Pentru început, extragem verificarea disponibilității într-o funcție separată, iar calea către director într-o variabilă separată:
$script_path = "C:TestPS ping"
#Trecem la funcția obiectului PictureBox deja creat și adresa IP care trebuie verificată.
#Ca rezultat, aceasta schimbă imaginea încărcată.
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"}
}
Vom scoate datele despre gazdă într-un fișier extern path.txt, scriindu-le în formatul „ip/host-functional-name/”, iar în document le vom prelua în array-uri. De asemenea, vom face calculul poziției pe Y mai automatizat. Toate acestea ne permit să creăm etichete și checkbox-uri prin apelarea unei funcții:

#создаем описательную линию, на вход идут: объект 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
}
Vom adăuga un loc pentru a afișa timpul ultimei verificări, deoarece este convenabil, și vom completa puțin acțiunea la apăsarea butonului.

$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
})
De asemenea, am adăugat o mică funcționalitate care, la detectarea unui gazd inaccesibil, anunță nu doar schimbarea indicatorului, ci și strigă din difuzoare.
Add-Type -AssemblyName System.Speech
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate = 5
$voice.Speak("Atenție! Atenție! Bază sub atac!")
Așadar, după câteva embellishments și convertirea într-o formă citibilă și convenabilă, a ieșit așa:
Codul complet al scriptului
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
#Trecem în funcția deja creată obiectul PictureBox și adresa IP care trebuie verificată.
#În output schimbă imaginea încărcată.
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("Eroare! Host " + $path_ip + ", indisponibil!")
}
}
#creăm o linie descriptivă, ca intrări avem: obiect Label, adresă IP, descriere și poziția pe axa 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
}
#creăm un indicator pentru linia descriptivă, ca intrări avem: obiect PictureBox, adresă IP și poziția pe axa 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 ='Legături active' #Numele din titlu
$main_form.Width = 300 #Lățimea fereastrei
$main_form.Height = 200 #Înălțimea ferestrei
$main_form.AutoSize = $true #Permitem să își schimbe dimensiunea în mod automatif dac este nevoie
$main_form.TopMost = $true #Aceasta este foarte important, permite fereastra să rămână deasupra altor feronci
$line = Get-content -LiteralPath $script_path"path.txt" #extragem datele despre hosturile necesare
$len = $line.Length #calculăm lungimea, de fapt un array lungimea fiecărei linii
$i = 0
#apoi declarăm array-urile de care avem nevoie mai departe
$ip = @() #array de ip
$capt = @() #array de descriere
$Labels =@() #array de Label
$PictureBoxs =@() #array de PictureBox
while($i -lt $len){
$f = $line[$i].IndexOf("/") #calculăm poziția începutului descrierii
$l = $line[$i].LastIndexOf("/") #calculăm poziția sfârșitului descrierii
$ip += $line[$i].Substring(0,$f) #extragem ip
$capt += $line[$i].Substring($f+1,$l-$f-1) #extragem descriere
#creăm câmpul Label
Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
#creăm câmpul PictureBox
Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top
$label_from_top += 15 #facem "pasul" pe axa Y
$Labels += $label_obj #adăugăm Label-ul creat în array-ul general
$PictureBoxs += $PictureBox_obj #adăugăm PictureBox-ul creat în array-ul general
$main_form.Controls.Add($Labels[$i])
$main_form.Controls.Add($PictureBoxs[$i])
$i +=1
}
#acest câmp conține ultima dată de verificare
$Label0 = New-Object System.Windows.Forms.Label
$Label0.Text = Get-Date
$Label0.Location = New-Object System.Drawing.Point(80,180)
$Label0.AutoSize = $true
#Atribuim evenimentul de apăsare a butonului pentru fiecare PictureBox conform logicii descrise anterior
$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 = "Reîncarcă"
$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()
Cuvânt înainte
Sper că acest tutorial va fi util pentru cineva. Dacă ai făcut asta aproape de la naștere, te felicit, eu nu am făcut-o. Dar sunt deschis să ascult comentariile și sugestiile tale.
A fost plăcut să mă cufund în acest proiect și să creez un mic, dar util instrument pentru uzul zilnic. Plănuiesc să implementez adăugarea și ștergerea nodurilor din GUI, precum și să realizez ceea ce trebuia să fie implementat inițial, adică actualizarea automată a statusurilor fără a fi nevoie să apeși butonul, astfel încât să nu blocheze "powershell.exe".
