我尝试根据延迟时间(以毫秒为单位)在 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
- 第 13 行:
elseif ($trace -Match '[1-0][1-9] ms' )
——[1-0] 是向后的,不被接受。 - 虽然这确实有效,但我发现它更容易理解,而且不太可能中断,例如由于其他字符,例如
<1 ms
,如果将输出转换为整数并进行比较。