1

我试图制作一个运行 tracert 的脚本,然后在每一跳上执行 ping。目前,tracert 困扰着我,因为变量的变化取决于主机是否可访问。

Tracert 执行跳数计数、3 次 ping,然后发布地址或主机名。如果主机名不可访问,它可能会给出一个 * 代替。

例如:

  1    <1 ms    <1 ms    <1 ms  10.3.2.1
  2     *       <1 ms    <1 ms  FA0-0.100M.rc00-rhv.aplus.dk [62.61.128.142]
  3     *        1 ms     1 ms  hor2.ae15-cr1.danskkabeltv.dk [62.61.137.86]
  4     *        1 ms     1 ms  TE2-2.10G.rc02-hor.aplus.dk [62.61.138.44]
  5     1 ms    <1 ms    <1 ms  speedtest01-hor.aplus.dk [62.61.131.22]

上面的例子,所有的行都不同,因为 1 ms OR * 如果延迟。

如果写了一些代码:

SET Dest=speedtest.danskkabeltv.dk
SET LineStart=1
SET LineEnd=30
FOR /F "tokens=1,8,9 delims= " %%A IN ('Tracert %Dest%') DO IF %%A GEQ %LineStart% IF %%A LEQ %LineEnd% (
@((timeout /t 2 /nobreak)>nul)
call :GetPing %%A %%B %%C )

pause

和:

A = Hop count
B = Hostname (Or IP address if no hostname)
C = IP address (If hostname is present)

这只是其中的一部分。但由于我依赖 AB 和 C 作为那些 IP 地址和主机名,如果我在 ms 列中得到 * 左右,我会得到错误的结果。

我不知道如何搜索 IP 地址,是否有办法将 for /f 反转,以首先获取最后一列?

谢谢 :)

编辑

嘿伙计们,感谢所有的帮助。我已经尝试过你们使用的一些方法,但我似乎真的无法得到正确的结果。

根据要求,整个代码和我想要的结果:

@ECHO OFF &SETLOCAL disableDelayedExpansion
SET "Dest=speedtest.danskkabeltv.dk"
SET /a LineStart=1
SET /a LineEnd=30
FOR /F "delims=" %%X IN ('Tracert -w 300 %Dest%') DO (
CALL:GetTraceLine %%~X
)
pause
GOTO:EOF

:GetTraceLine (
SETLOCAL
if "%1"=="Tracing" ( 
    EXIT /b
)

SET "Line=%~1"
SET "Line=%Line: ms =%"
FOR /F "tokens=1,5,6 delims= " %%A IN ("%Line%") DO IF %1 GEQ %LineStart% IF %1 LEQ %LineEnd% (
SET /a Hop=%%A
SET /a HOST=%%B
SET /a IP=%%C

if "%HOP%"=="Tracing" ( 
    EXIT /b
)

if "%HOST%"=="Request" ( 
    echo Hop: %HOP% Packetloss: ---                Average: ---       Host: Timeout
    EXIT /b
)


if "%IP%"=="" ( 
    call :GetPing %%A %HOST%
    EXIT /b
)
ELSE (
        FOR /F "delims=[]" %%A IN ('%IP%') DO (
            set IP=%%A
        )  

    call :GetPing %%A %IP% %HOST%
    EXIT /b

    )

)

:GetPing (
SetLocal
@ECHO OFF
SET AVG=---
SET LOSS=---
SET TARGET=%2
SET TARGET2=%3
SET HOP=%1


SET PingCMD=ping.exe -w 300 -n 30 %TARGET%
FOR /f "tokens=3 delims=," %%A IN ('%PingCMD%') DO (
        call :GetLoss %%A
        call :GetAvg %%A
)
echo Hop: %HOP% Packetloss: %loss%                Average: %avg%       Host: %TARGET% %TARGET2%
)
EXIT /b

:GetLoss
IF "%1"=="Lost" SET loss=%2 %3%% %4
EXIT /b
:GetAvg
IF "%1"=="Average" SET avg=%2 %3
EXIT /b

它似乎没有“剥皮”第一行,当我调用 GetTraceLine 时,我仍然在该行中得到“ms ms”。

我之后的结果是这样的:

Hop: 1  Packetloss: 0 (0% loss)     Average: 0ms    IP: 192.168.1.1  
Hop: 2  Packetloss: 0 (0% loss)     Average: 0ms    IP: 10.59.17.1  
Hop: 3  Packetloss: 0 (0% loss)     Average: 2ms    IP: 172.17.2.137  
Hop: 4  Packetloss: 0 (0% loss)     Average: 6ms    IP: 172.17.4.36  
Hop: 5  Packetloss: 0 (0% loss)     Average: 4ms    IP: 172.17.4.10  
Hop: 6  Packetloss: 0 (0% loss)     Average: 2ms    IP: 172.17.4.3  
Hop: 7  Packetloss: 0 (0% loss)     Average: 3ms    IP: 80.72.159.241       Host: lt-0-0-0.mx-1a.ip.cirque.dk
Hop: 8  Packetloss: 0 (0% loss)     Average: 2ms    IP: 194.255.185.193     Host: 0xc2ffb9c1.linknet.dk.telia.net
Hop: 9  Packetloss: 0 (0% loss)     Average: 2ms    IP: 194.255.133.97      Host: 0xc2ff8561.linknet.dk.telia.net
Hop: 10 Packetloss: 0 (0% loss)     Average: 5ms    IP: 194.255.133.98      Host: 0xc2ff8562.linknet.dk.telia.net 
Hop: 11 Packetloss: 0 (0% loss)     Average: 3ms    IP: 87.72.143.234  
Hop: 12 Packetloss: ---             Average: ---    IP: Timeout
Hop: 13 Packetloss: ---             Average: ---    IP: Timeout
Hop: 14 Packetloss: 0 (0% loss)     Average: 3ms    IP: 62.61.131.22        Host: speedtest01-hor.aplus.dk

我希望它更有意义:)

再次感谢所有的帮助!

4

4 回答 4

4
for /f "tokens=5 delims=ms " %a in ('tracert -4 -d speedtest01-hor.aplus.dk ^|find " ms "') do @echo %a

对于批处理文件中的使用,所有百分号加倍。

于 2014-03-25T16:57:43.797 回答
0
@ECHO OFF
SETLOCAL
FOR /f "delims=" %%a IN (q22639584.txt) DO SET "line=%%a"&CALL :process

GOTO :EOF

:process
SET "line=%line:<=%"
CALL :select %line%
ECHO %A%+%B%+%C%
GOTO :eof

:select
SET A=%1
:selectl
shift
SET "B=%1"
SET "C=%2"
SET "line=%3"
IF DEFINED line GOTO selectl
IF %c:~0,1%==[ (SET "c=%c:~1,-1%") else (SET "B=")
GOTO :eof

我使用了一个名为q22639584.txt包含您的数据的文件进行测试。

行与+字段之间的字符一起报告。

如果你能向我们展示你想要的结果,那就太好了。我只是假设

1++10.3.2.1
2+FA0-0.100M.rc00-rhv.aplus.dk+62.61.128.142
3+hor2.ae15-cr1.danskkabeltv.dk+62.61.137.86
4+TE2-2.10G.rc02-hor.aplus.dk+62.61.138.44
5+speedtest01-hor.aplus.dk+62.61.131.22

是你想要的。

于 2014-03-25T16:05:09.397 回答
0
@ECHO OFF &SETLOCAL disableDelayedExpansion
SET "Dest=speedtest.danskkabeltv.dk"
SET /a LineStart=1
SET /a LineEnd=30
FOR /F "delims=" %%X IN (FILE) DO CALL:GetTraceLine "%%~X"
GOTO:EOF

:GetTraceLine
SETLOCAL
SET "Line=%~1"
SET "Line=%Line: ms =%"
FOR /F "tokens=1,5,6 delims= " %%A IN ("%Line%") DO IF %%A GEQ %LineStart% IF %%A LEQ %LineEnd% (
    call :GetPing %%A %%B %%C
)
EXIT /b

:GetPing
SETLOCAL
ECHO(%~1 %~2 %~3
EXIT /b

输出是:

1 10.3.2.1
2 FA0-0.100M.rc00-rhv.aplus.dk [62.61.128.142]
3 hor2.ae15-cr1.danskkabeltv.dk [62.61.137.86]
4 TE2-2.10G.rc02-hor.aplus.dk [62.61.138.44]
5 speedtest01-hor.aplus.dk [62.61.131.22]

- 一个班轮:

for /f %a in ('tracert -4 -d stackoverflow.com ^|sed -r "/\sms\s/!d; s/.*\s(.+)/\1/"') do @echo %a
于 2014-03-25T17:05:27.970 回答
0

这提供了更新问题中要求的信息类型,但不是所需的格式。

ping 结果依赖于英语。在 Windows 8.1 中测试

@echo off
setlocal enabledelayedexpansion
set "file=%temp%\tr999.tmp"
call :tr speedtest01-hor.aplus.dk
pause
goto :EOF
:tr
echo performing tracert to %1
for /f "skip=2 tokens=1,5 delims=ms " %%a in ('tracert -4 -d %1 ^|findstr "[0-9]"') do (
 if /i not "%%b" == "Reque" (
   set Packetloss=
   set average=*
   set host=
   echo checking hop %%a to %%b
   ping -a -n 4 %%b > "%file%"
   for /f "tokens=2" %%f in ('findstr "Pinging" ^< "%file%"') do set host=%%f
   for /f "tokens=4 delims==" %%f in ('findstr "Lost" ^< "%file%"') do set packetloss=%%f
   for /f "tokens=4 delims==" %%f in ('findstr "Average" ^< "%file%"') do set average=%%f
   >> "%file%.txt" echo Hop: %%a - Packetloss: !packetloss:~0,-1! - Average: !average! - IP: %%b - Host: !host! 
 ) else (
   >> "%file%.txt" echo Hop: %%a - *** timed out ***
 )
)
echo done
echo.
type "%file%.txt"
copy "%file%.txt" ".\tracert results.txt" >nul
del "%file%" "%file%.txt"
于 2014-03-26T19:25:24.747 回答