有没有办法在保存到文件之前更改命令行输出?

时间:2017-09-01 15:47:42

标签: windows batch-file cmd traceroute

我正在编写一个使用" 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.

4 个答案:

答案 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.

替换没有数字(没有IP地址)的任何内容

也许你想用以下代码替换两个-行:

echo ...

这不会输出没有IP地址的行。

对于 echo !ip!|findstr "[0-9]" >nul && echo %%a, !ip! &&内容,请参阅SS64

对于||语法,请参阅delayed expansion