尝试在 powershell 中对 tracert 的输出进行颜色编码 - 未按预期工作

尝试在 powershell 中对 tracert 的输出进行颜色编码 - 未按预期工作

我尝试根据延迟时间(以毫秒为单位)在 powershell 中将线条涂成绿色、黄色和红色。我们的远程工作流程规定,任何超过 40 毫秒的情况都是不好的,所以我想以视觉方式向运行测试的人展示这一点,测试将打包为 exe 文件,供他们下载并运行(如果需要)。

  • 1-19ms = 绿色
  • 20-39 毫秒 = 黄色
  • 40-500 毫秒 = 红色
  • “请求超时”=红色

但是,当我尝试将其放入 ISE 中时,它似乎表现得并不像预期的那样。它通常只为所有线路返回一种纯色,有时它会在跟踪路由测试中完全漏掉一些线路。我特意选择了一个随机的澳大利亚 IP 地址来运行测试,因为它距离很远,并且随着跳数的增加,应该会提供低到高延迟的良好组合。

有人能指出我可能哪里做错了吗?

$traceroute = tracert 47.74.90.56

foreach ($trace in $traceroute)
{
if ($trace -Match '[1-9] ms' )
{
write-host "$trace" -ForegroundColor green
}
elseif ($trace -Match 'request timed out' )
{
write-host "$trace" -ForegroundColor red
}
elseif ($trace -Match '[1-0][1-9] ms' )
{
write-host "$trace" -ForegroundColor green
}
elseif ($trace -Match '[2-3][0-9] ms' )
{
write-host "$trace" -ForegroundColor yellow
}
elseif ($trace -Match '[4-9][0-9] ms' )
{
write-host "$trace" -ForegroundColor red
}
elseif ($trace -Match '[1-9][0-9][0-9] ms' )
{
write-host "$trace" -ForegroundColor red
}
}

答案1

正则表达式模式的开头需要一个空格。否则,此行几乎总是匹配:

# matches '21 ms' and '199 ms'
if ($trace -Match '[1-9] ms') {}

在较新版本的 powershell 中,此行会出错,因为[1-0]顺序相反:

# will also match '111 ms'
elseif ($trace -Match '[1-0][1-9] ms' ) {}

Invalid pattern '[1-0][1-9] ms' at offset 4. [x-y] range in reverse order.

我也建议使用switch这样的比较,但只是为了易读性:

$traceroute = tracert $address

foreach ($trace in $traceroute) {
  switch -Regex ($trace){
    ' [1-9] ms'          { write-host "$trace" -F green;  break }
    'request timed out'  { write-host "$trace" -F red;    break }
    ' [01][1-9] ms'      { write-host "$trace" -F green;  break }
    ' [2-3][0-9] ms'     { write-host "$trace" -F yellow; break }
    ' [4-9][0-9] ms'     { write-host "$trace" -F red;    break }
    ' [1-9][0-9][0-9] ms'{ write-host "$trace" -F red;    break }
  }
}

答案2

  1. 第 13 行:elseif ($trace -Match '[1-0][1-9] ms' )——[1-0] 是向后的,不被接受。
  2. 虽然这确实有效,但我发现它更容易理解,而且不太可能中断,例如由于其他字符,例如<1 ms,如果将输出转换为整数并进行比较。

相关内容