2013-03-18 71 views
1

感谢您的任何帮助。批处理文件FOR Loop通过IP地址文本文件不工作

一直在尝试编写一个批处理文件,该文件只是从文本文件中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地址列表,每行一个。

在此先感谢。

回答

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 
+0

不错,但'IF%ERRORLEVEL%'不能工作,因为它扩大了只有在完整的块进行解析,一次,所以它是独立的PING的结果 – jeb 2013-03-18 22:41:25

+0

嗯,是的,它就像冻结%时间%...谢谢! – Endoro 2013-03-18 23:39:40

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 
    ) 
) 
1

大部分的例子上面会失败的各种原因
我下面的例子DOES在Win7工作

问题与上面的例子=
1.不能%ERRORLEVEL%检查平,因为它总是返回一个零(0)的错误级别,
。 。 。除非IP协议栈完全被占用。
来自PING.EXE命令的Errorlevel仅指示PING.EXE'按预期运行',
。 。 。并且没有指出答复或输出的内容。
* * * * * * * *

2. GREAT-IDEA到管PING命令通过 “FIND” 命令,
(。PREV我管道PING命令到一个txt文件,
,然后点击 “自回复”, “发现” 针对TXT-FILE)

-------  但是, '查找':
。 。就是因为这个原因失败:

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:管你平输出到FIND.EXE,使用 “TTL =”,而不是*
* * * * * * * *


= = = = = MY工作实施例:

@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

有关此BATFILE的其他注意事项:
1.请注意,在'FOR-Loop'内部,我将%ERRORLEVEL%引用为!ERRORLEVEL!
readup on“EnableDelayedExpansion”了解为什么正常的百分比变量在这些循环内不能正常工作。

2.还特别注意到我如何分割的“开放” &“关闭” parenthesises,
后,特别是“DO”第3行,和之前在第8行
有在“ELSE”一些关于如何断线的愚蠢规则,有'parens',DO的,ELSE的,&等

3.在这个例子中cpuipaddrs。TXT是一个普通的txt文件有3条线路,

192.168.1.1 
192.168.1.100 
192.168.1.111