Tere päevast kõigile, tahan jagada lihtsat juhendit "Kuidas lõpetada käsitsi kümne hosti pingi saatmine. Ilma registreerimise ja SMS-ita!".
Internetist pärit
Oluline: ma ei ole programmeerija ega süsteemiadministraator, kuid pean töötama samal ajal suure hulga serverid teenustega ja selle skripti kirjutasin oma mugavuse huvides.
Kellele see võib kasulik olla, palun lugege edasi.
Miks PowershellMul on kogemusi lihtsate programmide kirjutamisega Pythonis, kuid see nõuab kas installitud interpreteerijat või õigust .exe käivitamiseks, mis minu töös ei ole alati võimalik. Kuid Powershelli skripti saab tihti käivitada.
Kõik ei armasta konsooli/terminali
Mõtlen, et selles pole vastuolu, vastasel juhul kasutaksid kõik ikka konsooli postkastikliente ja *nix-süsteemides ei oleks GUI-d.
Kuna igapäevaselt kasutan Powershelli üsna primitiivselt, proovisin alguses aru saada, kas sellele on võimalik lisada GUI. Selgub, et on, ja üsna lihtsalt:

Add-Type -assembly System.Windows.Forms #Ühendame raamatukogu
$main_form = New-Object System.Windows.Forms.Form #Loome objekti meie "akna" jaoks
#Seame selle jaoks parameetrid
$main_form.Text ='Links up' #Nimi pealkirjas
$main_form.Width = 300 #Akna laius
$main_form.Height = 200 #Akna kõrgus
$main_form.AutoSize = $true #Anname sellele võimaluse vajadusel ise suurust muuta
$main_form.ShowDialog() #Käivitame "akna"
Lisame sellele väljundi elemendi ja saame elementaarse Windowsi akna. Tautoloogia?.

Add-Type -assembly System.Windows.Forms #Ühendame teegi
$main_form = New-Object System.Windows.Forms.Form #Loome muutuja meie "akna" jaoks
#Seame selle jaoks parameetrid läbi parameetrite
$main_form.Text ='Links up' #Pealkirja nimi
$main_form.Width = 300 #Akna laius
$main_form.Height = 200 #Akna kõrgus
$main_form.AutoSize = $true #Anname sellele võimaluse vajadusel ise suurust muuta
$Label = New-Object System.Windows.Forms.Label #Kõik vormi elemendid salvestatakse muutujatesse, kuid tegelikult on need objektid, nagu kõik teised muutujad Powershellis
$Label.Text = "Tere! Olen elementaarne Windowsi aken, aga mida sina oled saavutanud?" #Kuvatud tekst
$Label.Location = New-Object System.Drawing.Point(10,65) #Objekti asukoht vormis horisontaalselt ja vertikaalselt (x,y)
$Label.AutoSize = $true
$main_form.Controls.Add($Label) #Lisame loodud objekti vormi, et see skripti käivitamisel kaduma ei läheks
$main_form.ShowDialog() #Kutsume esile elementaarse aknaLisame dünaamikat
See tööriist, millega ma 'pingisin Yandexit' ja mountisin *.iso, on nüüd saanud eraldi GUI, kuid sellest ei piisa. Samamoodi saab kuvada teavet saadavuse kohta, kuid jälgimiseks tuleb skripti iga kord uuesti käivitada.
Esialgu joonistame kaks ikooni ja lisame võimaluse kuvada pilte.

$PictureBox = New-Object system.Windows.Forms.PictureBox #Piltide kuvamiseks mõeldud objekt nimega täielikult loogiline
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)
#Siin liikume edasi, seotame kuvatava pildi sõlme kättesaadavuse kontrollimise tulemusega, kasutades käsku
#<b>test-connection</b>, kus:
#-Count - määrab päringute arvu
#-computer - IP või domeeninimi päringuks
#-quiet - et me saaksime ainult Boolean väärtuse
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
$PictureBox.imageLocation = "C:Testyes.png" #Objekt pöördub vastava pildi poole
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Objekt pöördub vastava pildi poole
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$main_form.Controls.Add($PictureBox)
Meie DNS-id jälle häirivad...

Ja lisame veel nupu, et oleks võimalik näidud uuendada.

$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 = "Uuenda"
# Seome nupu vajutamise sündmusele iga PictureBoxi kõne vastavalt varem kirjeldatud loogikale
$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)

Imeline, nüüd tootmisse!?
Käsitsi kirjutades umbes pool tosinat hosti, sain ma järsku aru ühest asjast — see projekt saab ühel hetkel läbi, hostid vahetavad ja ma pean iga kord skripti muutma. Ühelt poolt ei ole see midagi hullu, see on ju lahendus endale kallile. Teiselt poolt see lahendus endale kallile, vaadake, mis välja tuleb:
Vaatamine ei ole nõrgema südamega inimestele
Add-Type -assembly System.Windows.Forms #Ühendame teegi
$main_form = New-Object System.Windows.Forms.Form #Loome muutuja meie "akna" jaoks
#Seame selle parameetrid läbi parameetrite
$main_form.Text ='Links up' #Pealkirja nimi
$main_form.Width = 300 #Akna laius
$main_form.Height = 200 #Akna kõrgus
$main_form.AutoSize = $true #Anname võimaluse automaatselt suurust muuta, kui on vaja
$Label = New-Object System.Windows.Forms.Label #Kõik vormi elemendid salvestatakse muutujatesse, kuid tegelikult on need objektid, nagu kõik teised muutujad Powershellis
$Label.Text = "ya.ru ............................" #Kuvamise tekst
$Label.Location = New-Object System.Drawing.Point(15,10) #Objekti asukoht vormis horisontaalselt ja vertikaalselt (x,y)
$Label.AutoSize = $true
$Label1 = New-Object System.Windows.Forms.Label #Kõik vormi elemendid salvestatakse muutujatesse, kuid tegelikult on need objektid, nagu kõik teised muutujad Powershellis
$Label1.Text = "8.8.8.8 ............................" #Kuvamise tekst Googali DNS-i aadress
$Label1.Location = New-Object System.Drawing.Point(15,30) #Objekti asukoht vormis horisontaalselt ja vertikaalselt (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 #Objekt piltide kuvamiseks, nagu loogiliselt peab olema
$PictureBox.width = 10
$PictureBox.height = 10
#Siin liigume edasi, seostades kuvatava pildi kontrollimise tulemusega, kasutades käsku
#<b>test-connection</b>, kus:
#-Count - edastab päringute arvu
#-computer - IP või domeeninimi päringu jaoks
#-quiet - et me saaksime ainult Boolean väärtuse
$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" #Objekt pääseb vastava pildi juurde
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Objekt pääseb vastava pildi juurde
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox1 = New-Object system.Windows.Forms.PictureBox #Objekt piltide kuvamiseks nimetatakse üsna loogiliselt
$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" #Objekt pääseb vastava pildi juurde
}
Else {
$PictureBox1.imageLocation = "C:Testno.png" #Objekt pääseb vastava pildi juurde
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox2 = New-Object system.Windows.Forms.PictureBox #Objekt piltide kuvamiseks nimetatakse üsna loogiliselt
$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" #Objekt pääseb vastava pildi juurde
}
Else {
$PictureBox2.imageLocation = "C:Testno.png" #Objekt pääseb vastava pildi juurde
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox3 = New-Object system.Windows.Forms.PictureBox #Objekt piltide kuvamiseks nimetatakse üsna loogiliselt
$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" #Objekt pääseb vastava pildi juurde
}
Else {
$PictureBox3.imageLocation = "C:Testno.png" #Objekt pääseb vastava pildi juurde
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox4 = New-Object system.Windows.Forms.PictureBox #Objekt piltide kuvamiseks nimetatakse üsna loogiliselt
$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" #Objekt pääseb vastava pildi juurde
}
Else {
$PictureBox4.imageLocation = "C:Testno.png" #Objekt pääseb vastava pildi juurde
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox5 = New-Object system.Windows.Forms.PictureBox #Objekt piltide kuvamiseks nimetatakse üsna loogiliselt
$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" #Objekt pääseb vastava pildi juurde
}
Else {
$PictureBox5.imageLocation = "C:Testno.png" #Objekt pääseb vastava pildi juurde
}
$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 = "Uuenda"
# Seome nööri vajutamise sündmusele iga PictureBoxi vaatamise eelnevalt kirjeldatud loogika kohaselt
$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) #lisame loodud objekti vormile, et see ei kaoks skripti täitmisel
$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() #Kutsume esile elementaarse dialooge
Isegi kui järgida puhtust ja kinni pidada struktuurist, siis perioodilised redigeerimised toovad esile mitte kõige meeldivamad tunded.
Alustuseks viime ühenduse kontrollimise eraldi funktsiooni ja katalooge muutujasse:
$script_path = "C:TestPS ping"
#Liigume funktsiooni, kus on loodud PictureBox'i objekt ja IP-aadress, mida on vaja kontrollida.
#Väljundiks muudetakse omadust laetud pildi kohta.
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"}
}
Viime hosti andmed eraldi faili path.txt, salvestades need vormingus «ip/host-functional-name/», ning dokumendis võtame nad vastu massiividena. Samuti teeme Y-asendi arvutamise automatiseeritumaks. Kõik see annab meile võimaluse luua Label'id ja checkbox'id funktsiooni kutsumisega:

#создаем описательную линию, на вход идут: объект 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
}
Lisame koha viimase kontrollimise aja kuvamiseks, kuna see on mugav, ja täiustame veidi tegevust nupu vajutamisel.

$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
})
Lisaks liitsin väikese funktsiooni, mis avastades mittetoimivat hosti teavitab mitte ainult indikaatori muutmise kaudu, vaid ka häälitsedes kõlaritest.
Add-Type -AssemblyName System.Speech
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate = 5
$voice.Speak("Hoiatus! Hoiatus! Server on rünnaku all!")
Nii et pärast mitmeid kaunistamisi ja loetavaks mugavaks vormimiseks sai see välja niimoodi:
Terve skripti kood
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
#Liigume juba loodud PictureBox'i objekti ja IP-aadressi kaudu, mida tuleb kontrollida.
#Väljundis muudab see laetavat pilti.
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("Viga! Host " + $path_ip + ", ei ole kergesti juurdepääsetav!")
}
}
#loome kirjeldava rea, sisendiks: Label objekt, IP-aadress, kirjeldus ja Y-teljel asend
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
}
#loome kirjelduse rea indikaatori, sisendiks: PictureBox objekt, IP-aadress ja Y-teljel asend
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 ='Lingid üles' #Aken pealkirjas
$main_form.Width = 300 #Akna laius
$main_form.Height = 200 #Akna kõrgus
$main_form.AutoSize = $true #Annab võimaluse akna suurust iseseisvalt reguleerida vajadusel
$main_form.TopMost = $true #See on väga oluline, see võimaldab akent teistele üle paigutada
$line = Get-content -LiteralPath $script_path"path.txt" #Tõmbame vajalikud hostide andmed
$len = $line.Length #Arvutame pikkuse, täpsemalt iga rea pikkuse massiivi
$i = 0
#Edasi kuulutame massiivid, mis on edaspidi vajalikud
$ip = @() #massiiv ip
$capt = @() #massiiv kirjeldus
$Labels =@() #massiiv Label
$PictureBoxs =@() #massiiv PictureBox
while($i -lt $len){
$f = $line[$i].IndexOf("/") #Arvutame kirjeldamise alguskoha
$l = $line[$i].LastIndexOf("/") #Arvutame kirjeldamise lõppkoha
$ip += $line[$i].Substring(0,$f) #Tõmbame ip
$capt += $line[$i].Substring($f+1,$l-$f-1) #Tõmbame kirjeldamise
#Loome Label välja
Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
#Loome PictureBox välja
Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top
$label_from_top += 15 #Teeme Y-teljel "sammu"
$Labels += $label_obj #Lisame loodud Labeli üldmassivi
$PictureBoxs += $PictureBox_obj #Lisame loodud PictureBoxi üldmassivi
$main_form.Controls.Add($Labels[$i])
$main_form.Controls.Add($PictureBoxs[$i])
$i +=1
}
#See on välja viimase kontrollimise ajaga
$Label0 = New-Object System.Windows.Forms.Label
$Label0.Text = Get-Date
$Label0.Location = New-Object System.Drawing.Point(80,180)
$Label0.AutoSize = $true
# Seotame nupu vajutamise sündmuse iga PictureBox'iga vastavalt varem kirjeldatud loogikale
$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 = "Uuenda"
$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()
Eessõna
Loodan, et see juhend on kellelegi kasulik. Kui oled seda juba väiksest saadik teinud, siis paljude õnnitlus, mina ei ole. Kuid olen valmis kuulama teie kommentaare ja ettepanekuid.
Mulle oli endale meeldiv uurida ja koguda selline väike, kuid igapäevaelus kasulik rakendus. Plaanides on veel lisada ja eemaldada sõlme GUI-st ning teha ka automaatne olekute uuendamine, et mitte vajutada nuppu ja vältida 'powershell.exe' kukkumist.
