批处理文件FOR Loop通过IP地址文本文件不工作
感谢您的任何帮助。批处理文件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地址列表,每行一个。
在此先感谢。
试试这个:
@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
有在代码中的一个主要问题。
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
)
)
大部分的例子上面会失败的各种原因
我下面的例子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
不错,但'IF%ERRORLEVEL%'不能工作,因为它扩大了只有在完整的块进行解析,一次,所以它是独立的PING的结果 – jeb 2013-03-18 22:41:25
嗯,是的,它就像冻结%时间%...谢谢! – Endoro 2013-03-18 23:39:40