windows - FIND 命令返回空值

标签 windows batch-file null cmd

当运行一个确定一组 ping 的平均延迟的批处理时,我遇到了一个不寻常的问题。当通过管道向 FIND 命令发送 ping 时,如果在 ping 中未找到正在搜索的字符串,则 FOR 循环不会执行 DO 部分,而是跳到下一次迭代。

以这个命令为例:

FOR /F "tokens=*" %X in ('ping 8.8.8.8 -n 1 -w 1000^|FIND "Average"') do echo Result: %X

如果将其放入命令行中,您将得到预期的结果:

Result: Minimum = 23ms, Maximum = 23ms, Average = 23ms

对于失败的 ping,我希望看到: 结果:

结果是 null。您可以通过在其中扔一个失效 IP 来尝试此操作。

FOR /F "tokens=*" %X in ('ping 1.1.1.1 -n 1 -w 1000^|FIND "Average"') do echo Result: %X

当在批处理脚本中使用此命令时,该命令从文本文件中迭代 IP 地址,这会给我带来各种破坏。

例如,我有 ip.txt,其中包含 {8.8.8.8,8.8.4.4,1.1.1.1}。 当批处理文件循环运行时,我期望输出为:

8.8.8.8 - 23ms
8.8.8.8 - 36ms
1.1.1.1 - 
8.8.8.8 - 20ms
8.8.8.8 - 18ms
1.1.1.1 - 

相反,我得到:

8.8.8.8 - 23ms
8.8.8.8 - 36ms
8.8.8.8 - 20ms
8.8.8.8 - 18ms

FIND 返回的没有值的行会忽略 DO 阶段,而是立即迭代。

我以前从未见过 FOR 循环忽略 DO 阶段并在任何情况下继续迭代。任何解决方法,甚至只是解释为什么会发生这种情况都会很棒。

谢谢!

EDIT1:哈里·约翰斯顿

感谢您的快速回复。不幸的是,据我所知,这个问题无法在 FOR 循环之外解决。

这适用于单个 IP 示例,但不适用于迭代的多个值。问题是,正如所阐述的,您的示例在所有迭代之后只会返回一行,并且该行将是最后一次迭代的值。

这更接近实际运行的代码。创建一个名为 ip.txt 的文本文件,并在其中填充 IP 地址列表,每行一个。

测试.bat

@echo off
cls
if not exist [logs] md [logs]
FOR /F "eol=;" %%i in (ip.txt) do for /f "tokens=9" %%p in ('ping %%i -n 3 -w 1000 ^|FIND "Average"') do echo Result - %%p 
pause

ip.txt

8.8.8.8
1.1.1.1
8.8.4.4

使用您的解决方案,这只会回显 [8.8.4.4] 的 ping 结果。按原样,它将返回第一个和第三个结果,完成跳过第二个结果。

编辑2:德本汉姆

你们太棒了,一切都很完美!再次感谢您花时间解释问题并提供答案:)

FOR /F "eol=;" %%i in (ip.txt) do for /f "tokens=9" %%p in ('ping %%i -n 3 -w 1000^|find "Average"^|^|echo . . . . . . . . ERROR') do echo Result: %%p

最佳答案

这是预期的行为。 DO 子句每行输出执行一次,而 FIND 命令只输出与该子句匹配的行,因此只有至少有一行与该子句匹配时,才会执行 DO 子句。

你可以尝试这样的事情:

set result=No Response
FOR /F "tokens=*" %X in ('ping 1.1.1.1 -n 1 -w 1000^|FIND "Average"') do set result=%X
echo Result: %result%

关于windows - FIND 命令返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13061208/

相关文章:

matlab - Matlab 中 NULL 和空矩阵之间的区别

windows - 在 Windows 10 中找不到 istioctl 命令

c++ - 从 malloc() 进行的 Windows 和 Linux native 操作系统/系统调用是什么?

c++ - Visual Studio中基于字符的STL(流)容器的编译错误

java - 从 jar 文件中替换单个文件

null - 如何在 aerospike 中获取记录的空值

c# - 哪些 Windows 程序或服务可能会改变文件的 LastAccessed 属性?

windows - 为什么我的批处理脚本在 if 语句匹配时同时运行 if 和 else 语句?

batch-file - 如何制作向应用程序发送输入字符的批处理文件

java - 空指针错误数组缩短方法