处理“Tracert”输出(BATCH)

时间:2014-02-20 10:53:02

标签: batch-file

语言是批次

所以,标题说明了一切......我需要处理tracert输出以获取IP地址和仅IP地址。我可以说使用for命令,谢天谢地我对for有一点经验。

因为我们显然会使用分隔符,并且因为它旁边有IP ms字,所以我不应该这样做

for /f "tokens=2 delims=ms" %%a in ('tracert google.com') do echo set %%a=ip&echo ip>ips.txt

由于ms是分隔符,因此应该处理IP地址,对吗?

相反,我得到了这个非常奇怪的输出:

img

我可以做什么?

BTW,如果我做传统的跟踪,这就是它看起来如何。

enter image description here

1 个答案:

答案 0 :(得分:0)

1 - 为什么所有线路?该命令在命令行上执行,echo打开,并且对于for循环的每次执行,带有要执行的命令的行被回显到控制台,并且当该行执行echo命令时,结果也被回显。

2 - 为什么检索到的数据不正确?

  • tracert返回的行多于使用ip地址的行,并且您没有过滤它们

  • delims子句接受一系列单个字符,这些字符用作分隔符,而不是完整的单词。无论如何,它可以工作,因为所有m和s字符都被认为是分隔符,但是

  • tracert命令输出中的ip地址不是输出中的第二个标记,因此对于每一行,您都没有检索到已编辑的部分和

  • 执行set命令的每一行,但

    a)你不需要它将ip地址回显到文件和

    b)set命令应该以相反的顺序set var=value写出(或者我可能不理解你在做什么,对不起,在这种情况下),所以它应该是set ip=%a

    c)假设前面的所有内容都已更正,它仍然无效。 ip变量的值在您尝试回显它的同一行/块内更改。但是当到达代码行时,解析器已经消除了变量的读取(在开始执行行之前所有读取都被变量的值替换)。在这种情况下需要延迟扩展

3 - 如何解决?

对于直接命令行解决方案(如您的问题),这应该可以解决问题

(@for /f "tokens=8" %a in ('tracert -4 -d 10.10.10.10^|find "ms"') do @echo %a)>ips.txt

tracert的结果仅针对其中包含ms的行进行过滤。 tracert仅在ipv4中执行且没有名称解析,以在输出中获得一致的列数,选择eigth colum / token(显示ip地址的地方)并直接回显变量中的值。全部发送到文件并避免包含已执行的命令@command(等同于单个命令的echo off