nkasco
nkasco

Reputation: 336

Continuous Ping Powershell Form

OK so I am newer to using windows forms inside Powershell, and I am having a bit of trouble with the form being all laggy since there is a continuous ping running. Fundamentally all I need to do is display the IP address each time it runs a ping. I tried to search around and it seems like the proper way to do this is with a running job in the background?

I think the way this is currently written that the ping happens in the background but I'm not sure how to update the form (or if its even possible to make it visible to it?)

Here is a sample, any guidance with this would be greatly appreciated.

function global:ContinuousPing{
    $global:job = start-job {
        while($true){
            $pingStatus = Test-Connection google.com -Count 1
            $label.text = $pingStatus.IPV4Address.IPAddressToString
            #[System.Windows.Forms.Application]::DoEvents()
            start-sleep 1
        }
    }
}

Add-Type -AssemblyName System.Windows.Forms

$pingForm = New-Object System.Windows.Forms.Form
$label = New-Object System.Windows.Forms.Label
$button1 = New-Object System.Windows.Forms.Button

$ping = {
    ContinuousPing

    while($true){
        Receive-Job $job
    }
}

$label.Text = "Ping Status"

$button1.Location = New-Object System.Drawing.Point(100,10)
$button1.add_Click($ping)

$pingForm.Controls.Add($label)
$pingForm.Controls.Add($button1)

$pingForm.ShowDialog() | Out-Null

remove-job $job

Upvotes: 0

Views: 930

Answers (1)

Nick
Nick

Reputation: 1863

You need to separate the GUI updating and the ping task. This is easy to in languages that are designed to have GUIs like C# winforms, If you tried it you would be surprised how much easier it is than trying to bend a GUI over PowerShell.

You can try the link Mathias posted, It will do what you require.

Upvotes: 1

Related Questions