Sveiki visiem, vēlos dalīties ar vienkāršu instrukciju "Kā pārstāt manuāli pingot desmit hostus. Bez reģistrācijas un SMS!".
No interneta plašumiem
Svarīgi: es neesmu programmētājs un neesmu sistēmu administrators, bet man vienlaikus nākas strādāt ar lielu skaitu serveriem un pakalpojumiem, un šo skriptu es uzrakstīju savai ērtībai.
Visus, kam tas var būt noderīgi un interesanti, aicinu zem lasīt.
Kāpēc PowershellMan ir pieredze vienkāršu programmu rakstīšanā Python, taču tam ir nepieciešams vai nu instalēts interpreters, vai tiesības palaiest .exe, kas manā darbā ne vienmēr ir iespējams. Bet skriptu Powershell biežāk izdevies palaist.
Ne visi mīl konsoli/termināli
Domāju, ka tajā nav pretrunu, citādi visi vēl joprojām izmantotu konsoles e-pasta klientus, un *nix sistēmās nebūtu parādījies GUI.
Kad ikdienā man bieži jātiek galā ar Powershell diezgan primitīvi, es vispirms mēģināju saprast, vai tam var pievienot GUI. Izrādās, var, un pat diezgan vienkārši:

Add-Type -assembly System.Windows.Forms #Pievienojam bibliotēku
$main_form = New-Object System.Windows.Forms.Form #Izveidojam objektu ar mūsu "logu"
#Iestatām tam parametrus
$main_form.Text ='Links up' #Nosaukums virsrakstā
$main_form.Width = 300 #Loga platums
$main_form.Height = 200 #Loga augstums
$main_form.AutoSize = $true #Dodam tam iespēju mainīt izmēru, ja nepieciešams
$main_form.ShowDialog() #Izsaucam "logu"
Pievienojam tam izvades elementu un iegūstam elementāru Windows logu, vai ne?

Add-Type -assembly System.Windows.Forms #Pievienosim bibliotēku
$main_form = New-Object System.Windows.Forms.Form #Izveidojam mainīgo ar mūsu "logu"
#Nosakām tam parametrus caur parametriem
$main_form.Text ='Links up' #Virsma nosaukums
$main_form.Width = 300 #Loga platums
$main_form.Height = 200 #Loga augstums
$main_form.AutoSize = $true #Ļaujam tam mainīt izmēru pašam, ja nepieciešams
$Label = New-Object System.Windows.Forms.Label #Visi formas elementi tiks ievietoti mainīgajos, bet faktiski tie ir objekti, kā jebkuri citi mainīgie PowerShell
$Label.Text = "Sveiki! Es esmu pamata Windows logs, bet ko tu esi sasniedzis?" #Izvade teksts
$Label.Location = New-Object System.Drawing.Point(10,65) #Objekta novietojums formā pa horizontāli un vertikāli (x,y)
$Label.AutoSize = $true
$main_form.Controls.Add($Label) #Pievienojam izveidoto objektu formai, lai tas nepazustu skripta izpildes laikā
$main_form.ShowDialog() #Aicinām atvērt pārejošu pamata loguPievienosim dinamiku
Tagad instruments, ar kuru es "pingoju Yandex" un montēju *.iso, ir ieguvis atsevišķu GUI, bet tas nav viss. Līdzīgā veidā var izvadīt informāciju par pieejamību, bet monitorēšanai katru reizi būs jāpārstartē skripts.
Vispirms uzmeistarosim divas ikonas un pievienosim iespēju attēlu izvadīšanai.

$PictureBox = New-Object system.Windows.Forms.PictureBox #Objekts attēlu displejam ir saprotams nosaukums
$PictureBox.width = 10
$PictureBox.height = 10
$PictureBox.location = New-Object System.Drawing.Point(178,12)
#Šeit mēs pieejam pie lietas, sasaistot attēlu ar rezultātu par pieejamību izmantojot komandu
#<b>test-connection</b>, kur:
#-Count - nosaka pieprasījumu skaitu
#-computer - IP vai domēna vārds pieprasījumam
#-quiet - lai atgrieztu tikai Boolean vērtību
if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) {
$PictureBox.imageLocation = "C:Testyes.png" #Objekts norāda uz atbilstošo attēlu
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Objekts norāda uz atbilstošo attēlu
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$main_form.Controls.Add($PictureBox)
Atkal mūsu DNS serveri uzvedas dīvaini…

Un vēl pievienosim pogu, lai būtu iespēja atjaunināt rādījumus.

$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"
# Pievienojam pogas nospiešanas notikumam katra PictureBox piekļuvi saskaņā ar iepriekš aprakstīto loģiku
$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)

Brīnišķīgi, tagad ražošana!?
Rokasgrāmatā nosakot apmēram pusduci hostus, es pēkšņi sapratu vienu lietu — ka šis projekts beigsies, hosti mainīsies un man katru reizi būs jāmaina skripts. No vienas puses, nekas briesmīgs, tas ir taču risinājums man pašam. No otras puses, paskatieties, kas sanāk:
Skats nav vājajiem sirdīm
Add-Type -assembly System.Windows.Forms #Pievienojam bibliotēku
$main_form = New-Object System.Windows.Forms.Form #Izveidojam mainīgi ar mūsu "logu"
#Norādām parametru logam
$main_form.Text ='Links up' #Nosaukums virsrakstā
$main_form.Width = 300 #Loga platums
$main_form.Height = 200 #Loga augstums
$main_form.AutoSize = $true #Atļaujam tam automātiski mainīt izmēru, ja nepieciešams
$Label = New-Object System.Windows.Forms.Label #Visi formas elementi tiks piešķirti mainīgajiem, bet patiesībā tie ir objekti, kā jebkuri citi mainīgie PowerShell
$Label.Text = "ya.ru ............................" #Izvērstais teksts
$Label.Location = New-Object System.Drawing.Point(15,10) #Objekta novietojums logā horizontāli un vertikāli (x,y)
$Label.AutoSize = $true
$Label1 = New-Object System.Windows.Forms.Label #Visi formas elementi tiks piešķirti mainīgajiem, bet patiesībā tie ir objekti, kā jebkuri citi mainīgie PowerShell
$Label1.Text = "8.8.8.8 ............................" #Izvērstais teksts googl-ovskā DNS
$Label1.Location = New-Object System.Drawing.Point(15,30) #Objekta novietojums logā horizontāli un vertikāli (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 #Objekts attēlu attēlošanai sauc visai loģiski
$PictureBox.width = 10
$PictureBox.height = 10
#Šeit mēs pievēršamies būtiskajai daļai, piesaistot attēlu, ko atkārtojam pieejamības pārbaudes rezultātu, izmantojot komandu
#<b>test-connection</b>, kur:
#-Count - pārsūta pieprasījumu skaitu
#-computer - IP vai domēna vārds pieprasījumam
#-quiet - lai mums atgrieztos tikai Boolean vērtība
$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" #Objekts attiecas uz attiecīgo attēlu
}
Else {
$PictureBox.imageLocation = "C:Testno.png" #Objekts attiecas uz attiecīgo attēlu
}
$PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox1 = New-Object system.Windows.Forms.PictureBox #Objekts attēlu izvietošanai nosaukts pilnīgi loģiski
$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" #Objekts attiecas uz attiecīgo attēlu
}
Else {
$PictureBox1.imageLocation = "C:Testno.png" #Objekts attiecas uz attiecīgo attēlu
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox2 = New-Object system.Windows.Forms.PictureBox #Objekts attēlu izvietošanai nosaukts pilnīgi loģiski
$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" #Objekts attiecas uz attiecīgo attēlu
}
Else {
$PictureBox2.imageLocation = "C:Testno.png" #Objekts attiecas uz attiecīgo attēlu
}
$PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox3 = New-Object system.Windows.Forms.PictureBox #Objekts attēlu izvietošanai nosaukts pilnīgi loģiski
$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" #Objekts attiecas uz attiecīgo attēlu
}
Else {
$PictureBox3.imageLocation = "C:Testno.png" #Objekts attiecas uz attiecīgo attēlu
}
$PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox4 = New-Object system.Windows.Forms.PictureBox #Objekts attēlu izvietošanai nosaukts pilnīgi loģiski
$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" #Objekts attiecas uz attiecīgo attēlu
}
Else {
$PictureBox4.imageLocation = "C:Testno.png" #Objekts attiecas uz attiecīgo attēlu
}
$PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom
$PictureBox5 = New-Object system.Windows.Forms.PictureBox #Objekts attēlu izvietošanai nosaukts pilnīgi loģiski
$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" #Objekts attiecas uz attiecīgo attēlu
}
Else {
$PictureBox5.imageLocation = "C:Testno.png" #Objekts attiecas uz attiecīgo attēlu
}
$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 = "Pārlādēt"
# Ķēde notikuma aktivizēšanai pogas nospiešanas laikā katram PictureBox saskaņā ar iepriekš aprakstīto loģiku
$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) #pievienojam izveidoto objektu formai, lai tā nepazūd izpildes laikā
$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() #Izsaukt pazemīgu elementu logu
Pat ja ievērojam tīrību un ievērojam struktūru, tad periodiska rediģēšana radīs ne tās patīkamākās sajūtas.
Vispirms izdalām pieejamības pārbaudi atsevišķā funkcijā un ceļu uz katalogu atsevišķā mainīgajā:
$script_path = "C:TestPS ping"
#Pārejām uz funkciju ar jau izveidoto PictureBox objektu un IP adresi, kuru jāpārbauda.
#Rezultāts maina ielādējamo attēlu.
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"}
}
Izdalīsim informāciju par hostu ārējā failā path.txt, ierakstot to formātā "ip/host-funkcionālais-nosaukums/", bet dokumentā pieņemsim tos masīvos. Tāpat automatizēsim Y pozīcijas aprēķinu. Viss šis ļauj mums izveidot Label’ā un checkbox’ā, izmantojot funkciju:

#создаем описательную линию, на вход идут: объект 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
}
Pievienosim vietu pēdējās pārbaudes laika izvadīšanai, jo tas ir ērti, un nedaudz papildināsim darbību, nospiežot pogu.

$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
})
Tāpat es pievienoju mazu funkcionalitāti, kas, atklājot nepieejamu hostu, ziņo ne tikai ar indikatoru, bet arī izsauc no skaļruņiem.
Add-Type -AssemblyName System.Speech
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Rate = 5
$voice.Speak("Brīdinājums! Brīdinājums! Bāze tiek uzbrukta!")
Tātad, pēc dažām dekorācijām un pievienošanas lasāmākam izskatam, iznāk tā:
Pilns skripta kods
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
# Mēs pārejam uz funkciju, izmantojot jau izveidoto PictureBox objektu un IP adresi, kuru nepieciešams pārbaudīt.
# Izvade maina ielādēto attēlu.
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("Kļūda! Host " + $path_ip + ", nav pieejams!")
}
}
# Izveidojam uzskaitījuma rindu, ieejīgās vērtības: Label objekts, IP adrese, apraksts un Y ass pozīcija
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
}
# Izveidojam indikatoru aprakstošajai rindai, ieejīgās vērtības: PictureBox objekts, IP adrese un Y ass pozīcija
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 ='Saites augšpusē' # Nosaukums lodziņā
$main_form.Width = 300 # Loga platums
$main_form.Height = 200 # Loga augstums
$main_form.AutoSize = $true # ļauj atbilstoši pielāgot izmēru, ja nepieciešams
$main_form.TopMost = $true # Šī ir ļoti svarīga funkcija, ļaujot saglabāt logu virs citiem
$line = Get-content -LiteralPath $script_path"path.txt" # iegūstam datus par nepieciešamajiem hostiem
$len = $line.Length # aprēķinām garumu, t.i., katras rindas garumu masīvā
$i = 0
# Tālāk izsludinām masīvus, kas būs nepieciešami turpmāk
$ip = @() # IP masīvs
$capt = @() # apraksta masīvs
$Labels =@() # Label masīvs
$PictureBoxs =@() # PictureBox masīvs
while($i -lt $len){
$f = $line[$i].IndexOf("/") # aprēķinām apraksta sākuma pozīciju
$l = $line[$i].LastIndexOf("/") # aprēķinām apraksta beigu pozīciju
$ip += $line[$i].Substring(0,$f) # iegūstam IP
$capt += $line[$i].Substring($f+1,$l-$f-1) # iegūstam aprakstu
# Izveidojam Label lauku
Create_line -label ($label_obj = New-Object System.Windows.Forms.Label) -path_ip $ip[$i] -caption $capt[$i] -top $label_from_top
# Izveidojam PictureBox lauku
Create_link -PictureBox ($PictureBox_obj = New-Object system.Windows.Forms.PictureBox) -path_ip $ip[$i] -top $label_from_top
$label_from_top += 15 # palielinām Y ass atzīmi
$Labels += $label_obj # pievienojam izveidoto Label vispārējam masīvam
$PictureBoxs += $PictureBox_obj # pievienojam izveidoto PictureBox vispārējam masīvam
$main_form.Controls.Add($Labels[$i])
$main_form.Controls.Add($PictureBoxs[$i])
$i +=1
}
# Šis ir lauks ar pēdējo pārbaudes laiku
$Label0 = New-Object System.Windows.Forms.Label
$Label0.Text = Get-Date
$Label0.Location = New-Object System.Drawing.Point(80,180)
$Label0.AutoSize = $true
# Piesaistām notikumu, kad tiek nospiests katrs PictureBox, atbilstoši iepriekš aprakstītajai loģikai
$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 = "Pārlādēt"
$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()
Pēcvārds
Ceru, ka šis rokasgrāmata kādam noderēs. Ja jūs to darījāt no bērnības, apsveicu, es to nedarīju. Bet esmu gatavs uzklausīt jūsu komentārus un ieteikumus.
Man pašam bija patīkami pētīt un izveidot šādu nelielu, taču noderīgu utilītu. Plānā vēl ir iekļauts funkciju pievienošana un dzēšana no GUI, kā arī automātiska statusu atjaunināšana bez nepieciešamības "klikšķināt" uz pogas un lai tas nenoslogotu "powershell.exe".
