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

问题描述:

我正在写使用“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://*.com/users/2152082/stephan)建议已经使用__FINDSTR__。 __FIND__也许也可以用作过滤器应用程序。在写入文件之前,还可以使用__FOR__,__SET__和__IF__重新格式化输出。还有更多的方法。用'/?'运行它们以获得帮助。 – Mofi

也许下面的帮助,我相信你,你可以使用它,把它调整自己使用: Batch - Parsing the output of Tracert

从一个命令的输出中跳过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 

使用您的回复和一些搜索,我想出了这个解决方案:

@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地址。

如果任何人有关于如何去除多余的这些数据最后一位什么好主意,我们将不胜感激。否则,这对我来说是一个完美可行的输出。所以感谢您的帮助!:)

@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

这很可爱,正是我需要的,谢谢! –