Selamat siang, saya ingin membagikan instruksi sederhana "Bagaimana saya bisa berhenti melakukan ping secara manual ke selusin host. Tanpa registrasi dan SMS! "
Dari InternetPenting : Saya bukan seorang programmer atau administrator sistem, tetapi saya harus bekerja secara bersamaan dengan sejumlah besar server dan layanan, dan saya menulis skrip ini untuk kenyamanan saya sendiri.
Untuk semua yang mungkin menemukan ini
berguna, penasaran, saya bertanya di bawah kucing.
Mengapa PowershellSaya memiliki pengalaman menulis program Python sederhana, tetapi membutuhkan penerjemah yang diinstal atau hak untuk menjalankan .exe, yang, sebagai bagian dari pekerjaan saya, tidak selalu memungkinkan. Tetapi skrip Powershell sering menemukan kemampuan untuk dijalankan.
Tidak semua orang menyukai konsol / terminal
Saya pikir ini bukan kontradiksi, kalau tidak semua orang akan tetap menggunakan klien konsol mail dan GUI tidak akan muncul di * nix-systems.Karena dalam kehidupan sehari-hari saya harus menggunakan Powershell agak primitif, untuk awalnya saya mencoba memahami apakah mungkin untuk mengikat GUI ke dalamnya. Ternyata Anda bisa, dan bahkan cukup sederhana:
Add-Type -assembly System.Windows.Forms # $main_form = New-Object System.Windows.Forms.Form # "" # $main_form.Text ='Links up' # $main_form.Width = 300 # $main_form.Height = 200 # $main_form.AutoSize = $true # , $main_form.ShowDialog() # ""
Tambahkan elemen output ke ini dan dapatkan jendela
tautologi Windwows dasar
? .
Add-Type -assembly System.Windows.Forms # $main_form = New-Object System.Windows.Forms.Form # "" # $main_form.Text ='Links up' # $main_form.Width = 300 # $main_form.Height = 200 # $main_form.AutoSize = $true # , $Label = New-Object System.Windows.Forms.Label # , , Powershell $Label.Text = "! Windows-, ?" # $Label.Location = New-Object System.Drawing.Point(10,65) # (x,y) $Label.AutoSize = $true $main_form.Controls.Add($Label) # , $main_form.ShowDialog() #
Tambahkan speaker
Jadi alat yang saya “ping Yandex” dan mount * .iso mendapat GUI terpisah, tapi ini tidak cukup. Demikian pula, Anda dapat menampilkan informasi aksesibilitas, tetapi untuk pemantauan Anda harus memulai ulang skrip setiap kali.
Pertama, gambar dua ikon dan tambahkan kemampuan untuk menampilkan gambar.
$PictureBox = New-Object system.Windows.Forms.PictureBox # $PictureBox.width = 10 $PictureBox.height = 10 $PictureBox.location = New-Object System.Drawing.Point(178,12) # #<b>test-connection</b>, : #-Count - - #-computer - IP #-quiet - Boolean if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) { $PictureBox.imageLocation = "C:\Test\yes.png" # } Else { $PictureBox.imageLocation = "C:\Test\no.png" # } $PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $main_form.Controls.Add($PictureBox)
Lagi-lagi nama panggilan DNS kami nakal ...Dan tambahkan tombol sehingga Anda dapat memperbarui bacaan.
$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" # PictureBox $Button.Add_Click({ if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True) {$PictureBox.imageLocation = "C:\Test\yes.png"} Else {$PictureBox.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True) {$PictureBox1.imageLocation = "C:\Test\yes.png"} Else {$PictureBox1.imageLocation = "C:\Test\no.png"} }) $main_form.Controls.Add($Button)
Hebat, sekarang dalam produksi! ?
Setelah secara manual meresepkan sekitar setengah lusin host, saya tiba-tiba menyadari satu hal - tetapi proyek ini akan berakhir, host akan berubah dan saya harus mengedit skrip setiap waktu. Di satu sisi, tidak apa-apa, itu keputusan yang sama untuk Anda sendiri. Di sisi lain,
ini adalah keputusan untuk Anda sendiri tercinta, lihat apa yang terjadi:
Pemandangan itu bukan untuk orang yang lemah hati Add-Type -assembly System.Windows.Forms # $main_form = New-Object System.Windows.Forms.Form # "" # $main_form.Text ='Links up' # $main_form.Width = 300 # $main_form.Height = 200 # $main_form.AutoSize = $true # , $Label = New-Object System.Windows.Forms.Label # , , Powershell $Label.Text = "ya.ru ............................" # $Label.Location = New-Object System.Drawing.Point(15,10) # (x,y) $Label.AutoSize = $true $Label1 = New-Object System.Windows.Forms.Label # , , Powershell $Label1.Text = "8.8.8.8 ............................" # googl- DNS- $Label1.Location = New-Object System.Drawing.Point(15,30) # (x,y) $Label1.AutoSize = $true $Label2 = New-Object System.Windows.Forms.Label $Label2.Text = "192.168.xx ............................" $Label2.Location = New-Object System.Drawing.Point(15,50) $Label2.AutoSize = $true $Label3 = New-Object System.Windows.Forms.Label $Label3.Text = "192.168.xx ............................" $Label3.Location = New-Object System.Drawing.Point(15,70) $Label3.AutoSize = $true $Label4 = New-Object System.Windows.Forms.Label $Label4.Text = "10.0.xx ............................" $Label4.Location = New-Object System.Drawing.Point(15,90) $Label4.AutoSize = $true $Label5 = New-Object System.Windows.Forms.Label $Label5.Text = "162.102.xx ............................" $Label5.Location = New-Object System.Drawing.Point(15,110) $Label5.AutoSize = $true $PictureBox = New-Object system.Windows.Forms.PictureBox # $PictureBox.width = 10 $PictureBox.height = 10 # #<b>test-connection</b>, : #-Count - - #-computer - IP #-quiet - Boolean $PictureBox.location = New-Object System.Drawing.Point(235,12) if ((test-connection -Count 1 -computer ya.ru -quiet) -eq $True) { $PictureBox.imageLocation = "C:\Test\yes.png" # } Else { $PictureBox.imageLocation = "C:\Test\no.png" # } $PictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox1 = New-Object system.Windows.Forms.PictureBox # $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:\Test\yes.png" # } Else { $PictureBox1.imageLocation = "C:\Test\no.png" # } $PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox2 = New-Object system.Windows.Forms.PictureBox # $PictureBox2.width = 10 $PictureBox2.height = 10 $PictureBox2.location = New-Object System.Drawing.Point(235,52) if ((test-connection -Count 1 -computer 192.168.xx -quiet) -eq $True) { $PictureBox2.imageLocation = "C:\Test\yes.png" # } Else { $PictureBox2.imageLocation = "C:\Test\no.png" # } $PictureBox2.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox3 = New-Object system.Windows.Forms.PictureBox # $PictureBox3.width = 10 $PictureBox3.height = 10 $PictureBox3.location = New-Object System.Drawing.Point(235,72) if ((test-connection -Count 1 -computer 192.168.xx -quiet) -eq $True) { $PictureBox3.imageLocation = "C:\Test\yes.png" # } Else { $PictureBox3.imageLocation = "C:\Test\no.png" # } $PictureBox3.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox4 = New-Object system.Windows.Forms.PictureBox # $PictureBox4.width = 10 $PictureBox4.height = 10 $PictureBox4.location = New-Object System.Drawing.Point(235,92) if ((test-connection -Count 1 -computer 10.0.xx -quiet) -eq $True) { $PictureBox4.imageLocation = "C:\Test\yes.png" # } Else { $PictureBox4.imageLocation = "C:\Test\no.png" # } $PictureBox1.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::zoom $PictureBox5 = New-Object system.Windows.Forms.PictureBox # $PictureBox5.width = 10 $PictureBox5.height = 10 $PictureBox5.location = New-Object System.Drawing.Point(235,112) if ((test-connection -Count 1 -computer 162.102.xx -quiet) -eq $True) { $PictureBox5.imageLocation = "C:\Test\yes.png" # } Else { $PictureBox5.imageLocation = "C:\Test\no.png" # } $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" # PictureBox $Button.Add_Click({ if ((Test-Connection -Count 1 -computer ya.ru -quiet) -eq $True) {$PictureBox.imageLocation = "C:\Test\yes.png"} Else {$PictureBox.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 8.8.8.8 -quiet) -eq $True) {$PictureBox1.imageLocation = "C:\Test\yes.png"} Else {$PictureBox1.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 192.168.xx -quiet) -eq $True) {$PictureBox2.imageLocation = "C:\Test\yes.png"} Else {$PictureBox2.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 192.168.xx -quiet) -eq $True) {$PictureBox3.imageLocation = "C:\Test\yes.png"} Else {$PictureBox3.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 10.0.xx -quiet) -eq $True) {$PictureBox4.imageLocation = "C:\Test\yes.png"} Else {$PictureBox4.imageLocation = "C:\Test\no.png"} if ((Test-Connection -Count 1 -computer 162.102.xx -quiet) -eq $True) {$PictureBox5.imageLocation = "C:\Test\yes.png"} Else {$PictureBox5.imageLocation = "C:\Test\no.png"} }) $main_form.Controls.Add($Label) # , $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() #
Bahkan jika Anda mengamati kebersihan dan mematuhi struktur, pengeditan berkala tidak akan menimbulkan sensasi paling menyenangkan.
Untuk memulainya, kami membuat pemeriksaan ketersediaan dalam fungsi terpisah, dan jalur direktori dalam variabel terpisah:
$script_path = "C:\Test\PS ping" # PictureBox IP- . # . 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"} }
Kami akan mentransfer data host ke file path.txt eksternal, menulisnya dalam bentuk "ip / host-functional-name /", dan dalam dokumen kami akan membawanya ke dalam array. Kami juga membuat perhitungan posisi Y lebih otomatis. Semua ini memberi kami kesempatan untuk membuat Label dan kotak centang dengan memanggil fungsi:

# , : 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 }
Kami akan menambahkan tempat untuk menampilkan waktu pemeriksaan terakhir, karena nyaman, dan kami akan sedikit menambahkan tindakan saat mengklik tombol.
$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 })
Dan saya juga melampirkan fitur kecil
bukan bug , yang, ketika host yang tidak dapat diakses terdeteksi, melaporkan tidak hanya perubahan indikator, tetapi juga berteriak dari speaker.
Add-Type -AssemblyName System.Speech $voice = New-Object System.Speech.Synthesis.SpeechSynthesizer $voice.Rate = 5 $voice.Speak("! ! !")
Jadi setelah beberapa hiasan dan membawa ke tampilan yang mudah dibaca
bagi saya , ternyata seperti ini:
Kode skrip lengkap 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 # PictureBox IP- . # . 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("! " + $path_ip + ", !") } } # , : 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 } $main_form = New-Object System.Windows.Forms.Form $main_form.Text ='Links up' # $main_form.Width = 300 # $main_form.Height = 200 # $main_form.AutoSize = $true # , $main_form.TopMost = $true # , $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 } # $Label0 = New-Object System.Windows.Forms.Label $Label0.Text = Get-Date $Label0.Location = New-Object System.Drawing.Point(80,180) $Label0.AutoSize = $true # PictureBox $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 = "Reload" $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()
Kata penutup
Saya harap seseorang akan menemukan tutorial ini bermanfaat. Jika Anda hampir melakukannya dari buaian, maka selamat, saya tidak melakukannya. Tapi saya siap mendengarkan komentar dan saran Anda.
Bagi saya, itu bagus untuk menggali dan mengumpulkan utilitas yang kecil namun bermanfaat dalam kehidupan sehari-hari. Rencana masih harus menerapkan penambahan dan penghapusan node dari GUI, serta untuk melakukan
hal yang sama yang seharusnya dilaksanakan terutama pembaruan status otomatis tanpa perlu "menyodok" tombol dan sehingga tidak menggantung "powershell.exe".
Versi skrip terbaru di
GitHub