语言是批次
所以,标题说明了一切......我需要处理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地址,对吗?
相反,我得到了这个非常奇怪的输出:
我可以做什么?
BTW,如果我做传统的跟踪,这就是它看起来如何。
答案 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
)