2017-09-01 107 views
0

我正在寫使用「tracert的」命令查找IP地址,我會再使用做一些事情路由跟蹤的程序。在保存到文件之前,有沒有辦法更改命令行輸出?

我打算如何做到這一點,是通過將所有IP地址的輸出轉儲到文本文件中,追加>>output.txt,然後用Python或其他東西讀取它,並將其轉化爲可用的東西。

我的問題是,tracert還會在其輸出中顯示一些對我無用的內容,例如第一行說明跟蹤的位置以及最大跳數是多少,或者最後一行只說:「跟蹤完成」。

問題是我要跟蹤3500多個IP地址,而且這個數字只會增長,所以這是一個我打印在絕對沒用的文件中的大量文本。

這就是爲什麼我的問題是:有沒有什麼辦法,我可以將其保存在一個批處理文件前修改命令的輸出?

我運行命令:

tracert -h 30 -w 500 XX.XXX.XXX.XX >>cmd_output.txt 

輸出它給:

Tracing route to XYZ.net 
[XX.XXX.XXX.XX] 
over a maximum of 30 hops: 

    1 41 ms 18 ms  2 ms text.net [XXX.XXX.XXX.X] 
    2  2 ms  1 ms  1 ms text.net [XX.XXX.XXX.XXX] 
    3  1 ms  1 ms  1 ms text.net [XX.XXX.XXX.XXX] 
    4  5 ms  5 ms  5 ms text.net [XXX.XX.XX.XXX] 
    5  5 ms  5 ms  5 ms text.net [XXX.XX.XX.X] 
    6 25 ms 25 ms 25 ms XYZ.net [XX.XXX.XXX.XX] 

Trace complete. 
+3

最簡單的方法:'tracert命令www.google.com |找到 「MS」 >> file.txt'或'tracert命令www.google.com || findstr/bc:「」'(僅打印以空格開頭的行) – Stephan

+1

您已告訴我們您認爲無用的內容,但不是您在輸出中實際需要的內容。在我看來,我在所有專欄中都看不到任何目的。請讓我們知道你想要什麼,同時研究如何自己做,因爲這不是一個編碼請求網站。 – Compo

+1

現在的問題是:__是否有任何方式可以在將CMD的輸出保存到批處理文件之前修改其輸出?__答案是:__是的,在寫入文件之前有多種方法來過濾或重新格式化應用程序輸出.__我們不需要編寫更多內容,但[Stephan](https://stackoverflow.com/users/2152082/stephan)建議已經使用__FINDSTR__。 __FIND__也許也可以用作過濾器應用程序。在寫入文件之前,還可以使用__FOR__,__SET__和__IF__重新格式化輸出。還有更多的方法。用'/?'運行它們以獲得幫助。 – Mofi

回答

0

從一個命令的輸出中跳過N條第一行的確切公式爲:

for /f "skip=N tokens=*" %a in ('<command>') do @echo %a 

你的情況:

for /f "skip=4 tokens=*" %a in ('tracert -h 30 -w 500 XX.XXX.XXX.XX ') do @echo %a >> cmd_output.txt 
0

使用您的回覆和一些搜索,我想出了這個解決方案:

@echo off 
rem token 1 is hop-number 
rem token 6,7 or 8 may be IP, depending on whether 2 or less requests dont receive a response. 
for /f "tokens=1,6,7,8 delims=* " %%a in ('tracert -d -h 30 -w 350 8.8.8.8^|findstr /bc:" " ') do (
    echo %%a, %%b, %%c, %%d 
)>>ips.txt 
endlocal 

這將產生以下反應:

1, <1, ms, 192.168.1.240 
2, 1, ms, 195.114.237.65 
3, 1, ms, 94.247.72.33 
4, <1, ms, 82.150.154.129 
5, 1, ms, 217.170.0.244 
6, 2, ms, 193.239.117.142 
7, 2, ms, 108.170.241.140 
8, 2, ms, 216.239.41.49 
9, 5, ms, 74.125.37.130 
10, 209.85.243.253, , 
11, 5, ms, 108.170.237.135 
12, , , 
13, 5, ms, 8.8.8.8 

在每一行中,之前的第一個逗號總是跳數。然後IP地址可能會在第一個,第二個或第三個逗號之後。由於tracert每跳發送三個請求,其中兩個或三個請求可能會失敗。

如果請求失敗,結果是「*」,而不是「X毫秒」,因爲我用空格分隔,如果我總是拿第8個標記,它可能不包含IP地址或任何東西對於這個問題。

該代碼將始終包含的IP地址,但仍然會包含一些多餘的數據,如果再少兩個請求失敗,因爲那時令牌6或7將包含「X MS」某些部分。

在響應中,你會看到所有的請求是成功的,除了跳10,其中兩個請求失敗,跳12,其中三個請求失敗,因此未能tracert命令返回的IP地址。

如果任何人有關於如何去除多餘的這些數據最後一位什麼好主意,我們將不勝感激。否則,這對我來說是一個完美可行的輸出。所以感謝您的幫助!:)

0
@echo off 
setlocal enabledelayedexpansion 
for /f "tokens=1,*" %%a in ('tracert -d -h 30 -w 350 8.8.8.8 ^|findstr /bc:" "') do (
    for %%c in (%%b) do set ip=%%c 
    set ip=!ip:[=! 
    set ip=!ip:]=! 
    echo !ip!|findstr "[0-9]" >nul || set "ip=-" 
    echo %%a, !ip! 
) 

第二for%%c)獲得該行的最後一個字(這是IP地址或括號中的IP地址或的最後一個字「請求超時」(out.在英文Windows版本),該行的其餘部分只是爲了美化結果(移除支架,更換任何有沒有號碼(沒有IP地址)與-

也許你想更換兩個echo ...線只:

echo !ip!|findstr "[0-9]" >nul && echo %%a, !ip! 

這不會輸出沒有IP地址的行。

對於&&||啄,看到SS64

對於!variable!語法看到delayed expansion

+0

這很可愛,正是我需要的,謝謝! –

相關問題