Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理:从tracert检索IP/主机_Batch File_Traceroute_Sed - Fatal编程技术网

Batch file 批处理:从tracert检索IP/主机

Batch file 批处理:从tracert检索IP/主机,batch-file,traceroute,sed,Batch File,Traceroute,Sed,我试着制作一个脚本,运行一个tracert,然后在每一跳上执行ping。目前,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.

我试着制作一个脚本,运行一个tracert,然后在每一跳上执行ping。目前,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]
以及:

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

我不知道如何搜索IP地址,如果有一种方法可以反转a/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”的电话

结果如下:

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
我希望这更有意义:)

再次感谢所有的帮助

@ECHO关闭
SETLOCAL
对于/f“delims=”(q22639584.txt)中的%%a,请设置“line=%%a”&调用:进程
后藤:EOF
:进程
设置“line=%line:
@ECHO OFF”
SETLOCAL
对于/f“delims=”(q22639584.txt)中的%%a,请设置“line=%%a”&调用:进程
后藤:EOF
:进程
设置“行=%line:
在批处理文件内使用时,将所有百分比符号加倍

在批处理文件内使用时,将所有百分比符号加倍。

@ECHO OFF&SETLOCAL disableDelayedExpansion
设置“Dest=speedtest.danskkabeltv.dk”
设置/a行开始=1
设置/a LineEnd=30
对于/F“delims=”%(文件)中的%%X,请调用:GetTraceLine“%%~X”
后藤:EOF
:GetTraceLine
SETLOCAL
设置“行=%~1”
设置“行=%Line:ms=%”
对于/F“代币=1,5,6 delims=“%%A IN”(“%Line%”)如果%%A GEQ%LineStart%IF%%A LEQ%LineEnd%(
呼叫:GetPing%%A%%B%%C
)
退出/b
:GetPing
SETLOCAL
回声(%~1%~2%~3)
退出/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]
@ECHO OFF&SETLOCAL disableDelayedExpansion
设置“Dest=speedtest.danskkabeltv.dk”
设置/a行开始=1
设置/a LineEnd=30
对于/F“delims=”%(文件)中的%%X,请调用:GetTraceLine“%%~X”
后藤:EOF
:GetTraceLine
SETLOCAL
设置“行=%~1”
设置“行=%Line:ms=%”
对于/F“代币=1,5,6 delims=“%%A IN”(“%Line%”)如果%%A GEQ%LineStart%IF%%A LEQ%LineEnd%(
呼叫:GetPing%%A%%B%%C
)
退出/b
:GetPing
SETLOCAL
回声(%~1%~2%~3)
退出/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]
这提供了更新问题中要求的信息类型,但不完全是所需的格式

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"
@echo关闭
延迟扩展
设置“文件=%temp%\tr999.tmp”
电话:tr speedtest01-hor.aplus.dk
暂停
后藤:EOF
:tr
回显正在对%1执行跟踪
对于/f“跳过=2个令牌=1,5个delims=ms”%%a in('tracert-4-d%1^ | findstr“[0-9]”)do(
如果/i不是“%%b”=“重新请求”(
套袋损耗=
平均值=*
设置主机=
回显检查跳%%a到%%b
ping-a-n 4%%b>%file%
对于('findstr“ping”^<%file%”中的/f“tokens=2”%%f,请设置主机=%%f
对于/f“tokens=4 delims==”%%f in('findstr“Lost”^<%file%”),请设置packetloss=%%f
对于/f“tokens=4 delims==”%%f in('findstr“Average”^<%file%”),请设置Average=%%f
>>“%file%.txt”回显跃点:%%a-Packetloss:!Packetloss:~0,-1!-平均值:!平均值!-IP:%%b-主机:!主机!
)否则(
>>“%file%.txt”回显跃点:%%a-***超时***
)
)
回音完成
回响
键入“%file%.txt”
复制“%file%.txt”。\tracert results.txt”>nul
删除“%file%”%file%.txt

这给出了更新问题中要求的信息类型,但不完全是所需的格式

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"
@echo关闭
延迟扩展
设置“文件=%temp%\tr999.tmp”
电话:tr speedtest01-hor.aplus.dk
暂停
后藤:EOF
:tr
回显正在对%1执行跟踪
对于/f“跳过=2个令牌=1,5个delims=ms”%%a in('tracert-4-d%1^ | findstr“[0-9]”)do(
如果/i不是“%%b”=“重新请求”(
套袋损耗=
平均值=*
设置主机=
回显检查跳%%a到%%b
ping-a-n 4%%b>%file%
对于('findstr“ping”^<%file%”中的/f“tokens=2”%%f,请设置主机=%%f
对于/f“tokens=4 delims==”%%f in('findstr“Lost”^<%file%”),请设置packetloss=%%f
对于/f“tokens=4 delims==”%%f in('findstr“Average”^<%file%”),请设置Average=%%f
>>“%file%.txt”回显跃点:%%a-Packetloss:!Packetloss:~0,-1!-平均值:!平均值!-IP:%%b-主机:!主机!
)否则(
>>“%file%.txt”回显跃点:%%a-***超时***
)
)
回音完成
回响
键入“%file%.txt”
复制“%file%.txt”。\tracert results.txt”>nul
删除“%file%”%file%.txt


搜索“ms”。“ms”可能是internet地址的一部分。@Stephan,对不起,我忘了tracert的标题。@endro,我现在错过了什么吗?@foxidrive,为什么它不返回IP地址?我的理解是OP只想要IP地址,正如标题所说。搜索“ms”。“ms”可能是internet地址的一部分。@Stephan,对不起,我忘了tracert的标题。@Endro,我现在错过了什么吗?@foxidrive,为什么它不返回IP地址?我的理解是OP只想要IP地址,正如标题所说。你只想要IP地址,就像你的线程标题所说的吗?我想要跳数,ho检索到stname和ping(标题为sry:))编辑您的问题并在文本前后显示。我已按要求编辑了我的帖子:)可以使用tracert使用代码获取IP地址,然后使用ping再次遍历它们以获取packetloss、average和主机名。当两个项目变化为两位/三位数字时,您的格式将不具有结构化。您是否只需要如线程标题所示的IP地址?我希望检索跃点计数、主机名和ping(标题为sry:))编辑您的问题 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]
@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"