PowerShell GUI输出
我正在编写一个带有GUI的小PowerShell脚本,用于处理Ping命令。目前,我有脚本读取用户的输入,以确定要ping的IP地址/URL,然后将输出显示到富文本框中 但是,当前,命令完成后立即写入整个输出。我想让它实时显示每一行输出,这样它看起来就像在shell中运行命令一样 按下Ping按钮时,会调用以下函数(我认为这就是问题所在):PowerShell GUI输出,powershell,user-interface,ping,Powershell,User Interface,Ping,我正在编写一个带有GUI的小PowerShell脚本,用于处理Ping命令。目前,我有脚本读取用户的输入,以确定要ping的IP地址/URL,然后将输出显示到富文本框中 但是,当前,命令完成后立即写入整个输出。我想让它实时显示每一行输出,这样它看起来就像在shell中运行命令一样 按下Ping按钮时,会调用以下函数(我认为这就是问题所在): 我想这个问题可能可以在ForEach声明中得到解决,我只是不知道该怎么做!感谢您的帮助 您需要添加BEGIN{}PROCESS{}和END{}语句来控制函数
我想这个问题可能可以在ForEach声明中得到解决,我只是不知道该怎么做!感谢您的帮助 您需要添加BEGIN{}PROCESS{}和END{}语句来控制函数的工作方式。如果没有给出这样的条件,Powershell将假定所有内容都在END{}语句中,一次处理所有内容 换成这个
Function FNPing {
BEGIN {
}
PROCESS {
$OutputBox.Text = "Please Wait..."
$ping = ping ($InputBox.text)
$OutputBox.Text = ""
foreach ($line in $ping) {
$OutputBox.Appendtext($line+[char]13+[char]10)
}
}
END {
}
}
我们应该做到这一点。或者,您可以将函数
替换为过滤器
,该过滤器假定代码位于进程{}
块中
有关详细信息:我将尝试使用
测试连接
cmdlet。问题是ping一个外部exe,所以当它完成时,你从中得到的只是一个文本块。在ping运行时获取其输出的唯一方法是使用start process
并重定向输出(这相当混乱)
使用测试连接
你不会得到一个很好的摘要,但是信息都在那里。对于摘要信息,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对象
,您可以轻松地执行您想要的操作。在这里,我使用一个小的辅助函数来清除输出框,然后再将输入写入框:
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
}
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
}