我会尝试使用test-connection
cmdlet。问题是 ping 一个外部 exe,所以当它完成时,你得到的只是一团文本。在运行时获得 ping 输出的唯一方法是使用start-process
和重定向输出(这很混乱)。
test-connection
你不会得到一个漂亮的总结,但信息都在那里。对于摘要信息,measure-object
可以提供帮助。下面是 ping 输出的模仿,应该可以帮助您入门:
function fnping {
$outputBox.Text = "Please Wait..."
$count = 4
$results = test-connection $inputbox.Text -count $count | foreach { $outputBox.AppendText("Reply from $($_.ProtocolAddress): bytes=$($_.ReplySize) time=$($_.ResponseTime)ms TTL=$($_.TimeToLive)`r`n"); $_ }
$summary = $results | measure-object -Property ResponseTime -Average -Minimum -Maximum
$lost = $count - $summary.Count
$percentLost = $lost * 100.0 / $count
$outputBox.AppendText("Packets: Sent = $count, Received = $($summary.Count), Lost = $lost ($($percentLost)% loss)`r`n")
$outputBox.AppendText("Minimum = $($summary.Minimum)ms, Maximum = $($summary.Maximum)ms, Average = $($summary.Average)ms`r`n")
}
编辑
其实我的立场是正确的。将结果分配给变量 ( $ping
) 会导致 powershell 等待输出流关闭。您可以轻松地做您想做的事,使用foreach-object
. 在这里,我使用一个小的辅助函数在将输出框写入框之前清除输出框:
function WriteEach-Object() {
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[object[]]$inputs
)
begin { $outputBox.Text = "" }
process { $inputs | foreach { $outputBox.AppendText($_) } }
end { $outputBox.AppendText("`r`n") }
}
function fnping() {
$outputBox.Text = "Please Wait..."
ping $inputBox.Text | writeeach-object
}