2014-03-25 39 views
1

我試圖製作一個腳本,它運行一個tracert,然後在每一跳上執行ping。目前,tracert困擾我,因爲如果主機可以訪問,變量全部改變。批處理:從tracert檢索IP /主機

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毫秒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地址和事實主機名,我得到錯誤的結果,如果我在*列中獲得*左右。

我不知道如何尋找的IP地址,如果那裏有一種爲扭轉/ 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」線。

結果IM後是這樣的:

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 

我希望它更有意義呢:)

再次,感謝所有幫助!

+0

你想只有IP地址,因爲你的主題標題說? – foxidrive

+0

我想跳躍計數,主機名和ping檢索(標題爲sry :)) – Saku

+0

編輯您的問題,並顯示文本前後。 – foxidrive

回答

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

用於批處理文件中的所有雙百分號。

+0

搜索「ms」。 「ms」可能是互聯網地址的一部分。 – Stephan

+0

不錯,但失敗。 – Endoro

+0

@Stephan,對不起,我忘記了tracert的標題。 –

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 

是你想要的。

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 
0

這使得在updat要求的信息種類編輯的問題,但不是所需的格式。

它依賴於英語爲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" 
+0

檢查我編輯的答案 – foxidrive