【问题标题】:Ping Batch File Color Error LevelsPing 批处理文件颜色错误级别
【发布时间】:2014-11-12 08:40:55
【问题描述】:

下面是我目前正在使用的批处理文件,但我想对其进行修改,使其不仅是链接正常时为绿色,超时时为红色。如果响应不在特定范围内,我希望它变成黄色。因此,如果我的 RTT 范围不在 130-190 毫秒内,它会变成黄色。提前致谢

我希望屏幕在某个范围内为绿色,如果超出范围为黄色,请求超时为红色。

echo off & cls

TITLE = Test

:top

ping -n 1 8.8.8.8 | FIND "TTL="

IF ERRORLEVEL 1 (SET OUT=4F & echo Request timed out.) ELSE (SET OUT=2F)

color %OUT%

ping -n 3 -w 1000 127.0.0.1 >nul

GoTo top

【问题讨论】:

  • `RTT range` 应该代表什么?
  • 这是往返时间
  • 它有 3 个数字 - 最小值、最大值和平均值。你想要哪个?
  • 由于他只运行一次并提取包含 TTL 的行,我假设他想要基于 time 值的颜色。
  • 我希望屏幕在范围内为绿色,如果超出范围为黄色,请求超时为红色。

标签: batch-file ping errorlevel request-timed-out


【解决方案1】:

编辑以适应 cmets

@echo off
    setlocal enableextensions enabledelayedexpansion

    rem Get address from command line
    set "address=%~1"
    if not defined address set "address=127.0.0.1"

    rem Configure levels and colors 
    rem The format is initialValue:color in value descending format
    set "levels=9000:4f 500:5f 130:e0 0:a0"

    rem infinite loop
    for /l %%i in () do (
        rem retrieve information from ping command
        set "rtt=9999"
        set "ttl=?"
        for /f "tokens=3,4 delims==^<" %%a in (
            'ping -n 1 "%address%" ^| find "TTL="'
        ) do for /f "tokens=1 delims=m" %%c in ("%%a") do (
            set /a "rtt=%%c"
            set "ttl=%%b"
        )

        rem retrieve color
        set "color="
        for %%z in (%levels%) do for /f "tokens=1,2 delims=:" %%a in ("%%z") do (
            if not defined color if !rtt! geq %%a set "color=%%b"
        )

        rem show information
        if defined color color !color!
        echo(!time! - %address% - rtt[!rtt!] ttl[!ttl!]

        rem save to log
        for /f "tokens=1-4 delims=.:-/ " %%a in ("!date!") do (
            >> "pingLog_%%a%%b%%c%%d.txt" echo(!time! - %address% - rtt[!rtt!] ttl[!ttl!]
        )

        rem wait and repeat the process
        ping -n 3 localhost >nul 2>nul 
    )

它只是重复一个无限循环检查指示的地址(在此代码中从命令行读取)。

在每次迭代中,通过 ping 命令确定当前的 rtt,根据 rtt 选择的颜色以及随着颜色变化而回显到控制台的信息。

为了获取 rtt,执行 ping。如果主机处于活动状态,则输出中将是 TTL= 字符串。如果找到该行,则使用字符=&lt; 作为分隔符对其进行标记,以获取第三个标记(rtt 所在的位置),然后使用ms 中的m 分隔rtt 的数值。

随着 rtt 时间,级别列表中的值(对级别:颜色)被迭代。对于每个值,将级别和颜色分开,并根据 rtt 测试级别。如果 rtt 大于或等于级别,我们就找到了合适的颜色。

颜色改变,打印信息,代码在开始新的迭代之前等待

【讨论】:

  • 我没有做这么多,但我正在阅读 (address=%~1) 应该阅读 address=8.8.8.8
  • @phifer,只是被编码为可重用,将地址作为批处理文件的参数。它应该被称为rttMonitor.cmd 8.8.8.8,或者,当然,文件中的行可以更改为set "address=8.8.8.8"
  • 好的,现在我正在运行它,但 TTL 目前是 251,所以它应该是黄色的,但我显示的是绿色。还有一种方法可以使响应显示当前响应时间。
  • @phifer,TTL 不是 RTT。使用的值是 TTL 信息前的time=...ms
  • 我明白了。我的响应时间从 9999 到更正确的数字 308 左右交替变化。它是红色的,但应该是绿色的。也感谢您的帮助!
【解决方案2】:

我相信这与Batch ERRORLEVEL ping response 相关, 所以我会从那里重新发布答案。

感谢 Jon 的回答~

@echo off
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %MATCHES%

如果 ping 失败,则打印 0,如果成功,则打印 1。我让它看起来只是“0% 丢失”(不是特别是 4 个 ping),以便可以自定义 ping 的数量。

百分号已加倍,以免误认为应替换的变量。

FOR 技巧仅用于将命令的输出设置为环境变量的值。

您需要将“racer”编辑为 ip。如果您想要不同的变量,也可以更改“匹配项”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多