批处理文件'继续'到FOR循环

时间:2016-10-11 05:38:54

标签: windows batch-file

我目前正在支持一个正在升级办公室机器的技术团队,我需要跟踪在线机器的数量。

目前我所拥有的是一个文本文件(OfficeName.txt),其中包含一个机器名列表和一个批处理文件(OfficeName.bat)。

我想要发生的是让它循环遍历机器列表并对它们进行ping操作 如果ping成功,则从列表中删除名称并将计数器递增1,如果不成功,则转到列表中的下一台计算机。

我遇到的问题是,如果机器的ping结果返回“找不到主机”,它仍然将errorlevel设置为0,所以我不能使用IF / ELSE。

我目前的尝试是这样的:

@echo off

setlocal EnableDelayedExpansion

set /a counter=0
set "NVC="

for /F %%a in (%~n0.txt) do set "NVC=!NVC! %%a"

:ping
for %%i in (%NVC%) do (
    ping %%i -n 1 >nul | find "TTL=" >nul || echo. %%i is offline.
    set /a counter+=1
    echo %%i is online
    set "NVC=!NVC: %%i=!"
)
cls
echo. %counter% machines are online.
if defined NVC goto :ping

echo All machines in %~n0 are online.
pause

问题是,一旦“%% i离线”行完成,它就会继续到下一行并将其删除。

如果ping结果不好,有没有办法跳过ping下面的3行,并继续列表中的下一次迭代?

注意:我是从Server 2008运行它,ping Win 8.1计算机。

1 个答案:

答案 0 :(得分:2)

您的第一个问题是,您尝试在已重定向到NUL的输出中找到“TTL =”。删除该重定向,以便FIND获取搜索内容。

您的第二个问题是逻辑错误,即使您执行||子句,其他行也会执行。您需要使用ELSE或其他IF子句。

最后,我认为你的IP地址列表处理过于复杂。

试试这个,看看它是否有意义。

@echo off & setlocal

set /a counteron=0
set /a counteroff=0

for /f %%i in (%~n0.txt) do (
    ping %%i -n 1 | find "TTL=" >nul 
    if errorlevel 1 (
        set /a counteroff+=1
        echo %%i is offline.
    ) else (
        set /a counteron+=1
        echo %%i is online
    )
)

echo.
echo %counteron% machines are online.
echo %counteroff% machines are offline.