我正在编写一个使用" tracert"命令找到IP地址的跟踪路由,然后我会用它来做一些事情。
我计划如何做到这一点,是将所有IP地址的输出转储到文本文件中,方法是附加>>output.txt
,然后用Python或其他东西读取它,然后把它变成可用的东西。 / p>
我的问题是,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.
答案 0 :(得分:0)
以下可能有帮助,我相信您可以使用它并根据自己的需要进行调整:Batch - Parsing the output of Tracert
答案 1 :(得分: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
答案 2 :(得分: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 ms”,因为我正在用空格分隔,如果我总是使用第8个标记,它可能不包含IP地址,或者任何内容那件事。
此代码将始终包含IP地址,但如果少于两个请求失败,则仍会包含一些多余的数据,因为令牌6和/或7将包含“X ms”的某些部分。
在响应中,您将看到所有请求都成功,除了第10跳,其中两个请求失败并跳转12,其中三个请求失败,因此tracert无法返回IP地址。
如果有人对如何删除这些多余数据的最后一点有任何明智的想法,我们将不胜感激。否则这对我来说是一个非常可行的输出。谢谢你的帮助! :)
答案 3 :(得分:0)
decltype(auto)
第二个@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
)获取该行的最后一个字(可以是括号中的IP地址或IP地址,也可以是“请求超时”的最后一个字。(英文Windows版本中的%%c
。其余行只是为了美化结果(删除括号,用out.
也许你想用以下代码替换两个-
行:
echo ...
这不会输出没有IP地址的行。
对于 echo !ip!|findstr "[0-9]" >nul && echo %%a, !ip!
和&&
内容,请参阅SS64
对于||
语法,请参阅delayed expansion