我目前正在支持一个正在升级办公室机器的技术团队,我需要跟踪在线机器的数量。
目前我所拥有的是一个文本文件(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计算机。
答案 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.