批处理文件FOR循环通过IP地址的文本文件无效

时间:2013-03-18 20:13:06

标签: for-loop batch-file cmd

感谢任何帮助。

一直在尝试编写一个批处理文件,只需从文本文件中ping一个IP地址列表。

我知道可以使用以下代码完成:

FOR /F %i in (yourFile.txt) DO yourcommand %i

并使用该格式创建以下内容:

::@echo off
pause
for /F %%a in (vlans.txt) do (

pause
ECHO Checking connection to subnet %%a, please wait....
PING -n 1 %%a|find "Reply from " >NUL
IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

:FAIL
ECHO Subnet %%a is unreachable
pause

:SUCCESS
ECHO Subnet %%a has passed!
pause

)

ECHO All subnets have now been tested....................
Pause

它需要整理一下,我已经注释了@Echo,所以我可以看到最新情况。输出如下:

C:\for /F "tokens=*" %a in (vlans.txt) do (

pause
ECHO Checking connection to subnet %a, please wait....
PING -n 1 %a  | find "Reply from "  1>NUL
IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

ECHO Subnet %a is unreachable
pause

ECHO Subnet %a has passed!
pause
)

C:\>(

pause
ECHO Checking connection to subnet 10.169.169.129, please wait....
PING -n 1 10.169.169.129  | find "Reply from "  1>NUL
IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

ECHO Subnet 10.169.169.129 is unreachable
pause

ECHO Subnet 10.169.169.129 has passed!
pause
)

Press any key to continue . . .

Checking connection to subnet 10.169.169.129, please wait....

C:\>ECHO Subnet %a has passed!

Subnet %a has passed!

C:\>pause

Press any key to continue . . .

那里发生了许多我不理解或没想到的事情,比如它没有循环遍历文本文件中的每个IP地址。它重复自己,首先没有填充变量,然后是变量。当批处理文件运行时,一些变量也不会进一步填充IP地址。

我刚开始编写批处理文件,所以我知道我的语法错误但不确定我哪里出错?

vlan.txt只有一个IP地址列表,每行一个。

提前致谢。

3 个答案:

答案 0 :(得分:1)

试试这个:

@echo off
for /F %%a in (vlans.txt) do (
    ECHO Checking connection to subnet %%a, please wait....
    PING -n 1 %%a|find "Reply from " >NUL
    IF %ERRORLEVEL% neq 0 (ECHO Subnet %%a is unreachable) else ECHO Subnet %%a has passed!
)
ECHO All subnets have now been tested....................
Pause

答案 1 :(得分:1)

代码中存在一个主要问题。

循环(或任何代码块)中的

GOTO打破了循环/块 因此,在第一个GOTO :somewhere循环结束后立即结束 块中的标签可能会导致奇怪的错误,因此也应该避免这种情况。

这两行可以优化

IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

IF ERRORLEVEL 1 ( echo FAIL ) ELSE (echo Success)

另一个问题是IF ERRORLEVEL 1语法本身 如果ERRORLEVEL等于或更高,则确实如此 因此,我更喜欢

更明显的语法
IF !ERRORLEVEL! EQU 0 echo SUCCESS

在块中,您无法使用百分比扩展来访问错误级别,因为在解析块时不会执行百分比扩展,而不是在执行块时。

对于延迟扩展(带感叹号),您需要先通过setlocal EnableDelayedExpansion启用它。

@echo off
setlocal EnableDelayedExpansion
for /F %%a in (vlans.txt) do (
    ECHO Checking connection to subnet %%a, please wait....
    PING -n 1 %%a >NUL
    IF !ERRORLEVEL! == 0 (
        ECHO Subnet %%a has passed^^!
    ) else (
        ECHO Subnet %%a is unreachable
    )
)

答案 2 :(得分:1)

上述大多数示例都将因各种原因而失败 以下我的示例在Win7中工作

上述例子的问题=
1.你不能%Errorlevel%检查ping,因为它总是返回零(0)错误级别,
。 。 。除非IP协议栈完全被冲洗 PING.EXE命令中的Errorlevel仅指示PING.EXE按预期“运行”,
。 。 。并且没有说明响应或输出是什么 * * * * * * * *

2. GREAT-IDEA通过“FIND”命令管道PING命令,
(... ... prev我正在将PING命令传递给txt文件,
然后“发现”反对该TXT文件。)

-------但是,'发现'来自“回复”:
。 。因为这个原因是失败的:

Pinging 192.168.1.100 with 32 bytes of data:
Reply from 192.168.1.34: Destination host unreachable.

在这种情况下,192.168.1.34(第二行)是您的本地主机报告目标是“无法访问”
-------------------------------------------
注意:任何成功的ping响应都将始终具有TTL =(某些数字小于65)

Pinging 192.168.1.1 with 32 bytes of data:
Reply from 192.168.1.1: bytes=32 time

TAKEAWAY:将ping输出传递给FIND.EXE,使用“TTL =”代替*
* * * * * * * *

= = = = =我的工作示例:

@ECHO OFF
setlocal EnableDelayedExpansion

for /F %%a in (cpuipaddrs.txt) do (
    ECHO.
    ECHO PINGING %%a, please wait....
    PING -n 2 %%a|find "TTL=" >NUL
    IF !ERRORLEVEL! neq 0 (ECHO       UNREACHABLE, %%a is UNREACHABLE
       ) ELSE (ECHO  %%a has pinged successfully )
)



= = = = =屏幕输出从上面开始:

PINGING 192.168.1.1, please wait....
 192.168.1.1 has pinged successfully

PINGING 192.168.1.100, please wait....
      UNREACHABLE, 192.168.1.100 is UNREACHABLE

PINGING 192.168.1.111, please wait....
 192.168.1.111 has pinged successfully

关于这个蝙蝠的补充说明:
1.注意在'FOR-Loop'中我引用了%ERRORLEVEL%!ERRORLEVEL!
读取“EnableDelayedExpansion”以了解正常%百分比变量在这些循环中的正常工作原因。
2.还要特别注意我如何分开'开放'和& 'close'括号,
特别是在第3行的“DO”之后,以及第8行的“ELSE”之前 关于如何打破线条有一些愚蠢的规则,有'parens',DO,ELSE和&等

3.在这个例子中,cpuipaddrs.txt是一个包含3行的常规txt文件,

192.168.1.1
192.168.1.100
192.168.1.111