我不明白您为什么要 ping 整个 IPv4 地址范围,即 ping 世界上所有的 IPv4 地址。您知道您尝试 ping 4 294 967 296 个地址吗?
set %%A.%%B.%%C.%%D = IP 行完全错误。变量的名称和分配给变量的字符串值位于等号的错误一侧。并查看Why is no string output with 'echo %var%' after using 'set var = text' on command line? 以了解为什么等号周围不应有空格。
每当在以( 开头并以匹配) 结尾的命令块中定义或修改变量并且在同一命令块中引用变量的值时,都需要延迟环境变量扩展。在命令提示符窗口set /? 中运行并阅读所有输出帮助页面以了解有关延迟扩展的详细信息,如下面的代码中使用的那样。
Windows 命令处理器不支持 FOR 循环中的标签。这里的解决方案是使用 IF 和 ELSE。
IF 条件可能永远不会为真,因为比较的是没有双引号的字符串和带双引号的字符串。此处需要使用双引号来进行字符串比较,但不会通过命令 IF 从比较的字符串中删除它们。
字符串比较的IF条件也是语法错误的原因,因为上面没有首先定义环境变量iptemp FOR,因此在解析命令方块。这导致在大多数外部 FOR 第一次执行之前就已经替换了%iptemp%,导致该行
if == "Packets: Sent = 1, Received = 0, Lost = 1 (100 loss)," (
而且这条线当然是完全错误的。注意:单个百分号也被删除。
要比较的字符串中的百分号必须用另外一个百分号转义,才能解释为文字字符,而不是变量引用的开头。
在下面最后一行 ECHO 的代码中,感叹号必须用 ^^ 转义才能解释为文字字符,因为启用了延迟扩展,这会从简单的文字改变 ! 的含义字符作为变量名称的分隔符,其值应该在解析命令块时被引用而不扩展。
@echo off
setlocal EnableDelayedExpansion
color b
title Get Online IPs
set "ListFile=IPlist.txt"
if exist "%ListFile%" del "%ListFile%"
for /L %%A in (0,1,255) do (
for /L %%B in (0,1,255) do (
for /L %%C in (0,1,255) do (
for /L %%D in (0,1,255) do (
set "IP=%%A.%%B.%%C.%%D"
for /F "delims=" %%i in ('%SystemRoot%\System32\ping.exe -n 1 !IP!') do set "iptemp=%%i"
if "!iptemp!" == "Packets: Sent = 1, Received = 0, Lost = 1 (100%% loss)," (
echo !IP! is offline.
) else (
echo !IP! is online^^!>>"%ListFile%"
)
)
)
)
)
endlocal
在我的德语 Windows 上,字符串比较永远不会正确,因此所有 IP 都是“在线”的,这当然是错误的。
最好使用控制台应用程序 PING 的退出代码,成功 ping 时为 0,错误时为 1。先前执行的命令或控制台应用程序的退出代码可以分别使用if errorlevel X 和if not errorlevel X 评估,具体取决于检查退出代码(错误级别)是否大于或等于X 或小于X。
@echo off
setlocal EnableDelayedExpansion
color b
title Get Online IPs
set "ListFile=IPlist.txt"
if exist "%ListFile%" del "%ListFile%"
for /L %%A in (0,1,255) do (
for /L %%B in (0,1,255) do (
for /L %%C in (0,1,255) do (
for /L %%D in (0,1,255) do (
set "IP=%%A.%%B.%%C.%%D"
%SystemRoot%\System32\ping.exe -n 1 !IP! >nul
if errorlevel 1 (
echo !IP! is offline.
) else (
echo !IP! is online^^!>>"%ListFile%"
)
)
)
)
)
endlocal
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
color /?
del /?
echo /?
endlocal /?
for /?
if /?
ping /?
set /?
setlocal /?
title /?
另请阅读 Microsoft 文章: