1

感谢任何帮助。

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

提前致谢。

4

3 回答 3

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 等于或大于该数字,则为 true。
因此我更喜欢更明显的语法

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
    )
)
于 2013-03-18T22:39:13.443 回答
1

上面的大多数示例将因各种原因而失败
我下面的示例在 Win7

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

2. GREAT-IDEA 通过“FIND”命令传送 PING 命令,
(... prev 我将 PING 命令传送到 txt 文件,
然后针对该 TXT 进行“查找” -文件。)

-------但是,“回复”中的“查找”:
. . 由于这个原因是失败的:

用 32 字节的数据 ping 192.168.1.100:
来自 192.168.1.34 的回复:无法访问目标主机。

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

用 32 字节的数据 ping 192.168.1.1:
来自 192.168.1.1 的回复:bytes=32 time

要点:将您的 ping 输出通过管道传输到 FIND.EXE,使用“TTL=”代替*
* * * * * * *


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

@ECHO 关闭
setlocal EnableDelayedExpansion

对于 (cpuipaddrs.txt) 中的 /F %%a 执行 (
    回声。
    ECHO PINGING %%a,请稍候....
    PING -n 2 %%a|找到“TTL=”>NUL
    如果!错误级别!neq 0 (ECHO UNREACHABLE, %%a 是 UNREACHABLE
       ) ELSE (ECHO %%a 已成功 ping 通)
)



= = = = = 上面的屏幕输出:

PINGING 192.168.1.1,请稍候......
 192.168.1.1 ping 通成功

PINGING 192.168.1.100,请稍候......
      无法访问,192.168.1.100 无法访问

PINGING 192.168.1.111,请稍候......
 192.168.1.111 ping 通成功

关于此 BATFILE 的附加说明:
1.请注意,在“FOR-Loop”内,我将 %ERRORLEVEL% 引用为 !ERRORLEVEL!
阅读“EnableDelayedExpansion”以了解为什么正常的 %Percent-Variables 在这些循环中不能正常工作。

2. 还要特别注意我如何拆分“打开”和“关闭”括号,
特别是在第 3 行的“DO”之后和第 8 行的“ELSE”之前
关于如何换行有一些愚蠢的规则, 带有'parens', DO's, ELSE's, & etc

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

192.168.1.1
192.168.1.100
192.168.1.111
于 2014-12-30T04:08:09.367 回答
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
于 2013-03-18T20:48:24.530 回答