PowerShell GUI输出

PowerShell GUI输出,powershell,user-interface,ping,Powershell,User Interface,Ping,我正在编写一个带有GUI的小PowerShell脚本,用于处理Ping命令。目前,我有脚本读取用户的输入,以确定要ping的IP地址/URL,然后将输出显示到富文本框中 但是,当前,命令完成后立即写入整个输出。我想让它实时显示每一行输出,这样它看起来就像在shell中运行命令一样 按下Ping按钮时,会调用以下函数(我认为这就是问题所在): 我想这个问题可能可以在ForEach声明中得到解决,我只是不知道该怎么做!感谢您的帮助 您需要添加BEGIN{}PROCESS{}和END{}语句来控制函数

我正在编写一个带有GUI的小PowerShell脚本,用于处理Ping命令。目前,我有脚本读取用户的输入,以确定要ping的IP地址/URL,然后将输出显示到富文本框中

但是,当前,命令完成后立即写入整个输出。我想让它实时显示每一行输出,这样它看起来就像在shell中运行命令一样

按下Ping按钮时,会调用以下函数(我认为这就是问题所在):


我想这个问题可能可以在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
}