2016-10-11 3 views
0

현재 사무실에서 기계를 업그레이드하는 기술자 팀을 지원하고 온라인 상태 인 기계의 양을 추적해야합니다.FOR 루프의 다음 반복으로 배치 파일 계속

현재 컴퓨터 이름 목록과 배치 파일 (OfficeName.bat)이 포함 된 텍스트 파일 (OfficeName.txt)이 있습니다.

내가 원하는 것은 기계 목록을 반복하여 핑 (ping)하는 것입니다.
ping이 성공적이면 목록에서 이름을 제거하고 실패 할 경우 카운터를 1 씩 증가시킨 다음 목록의 다음 컴퓨터로 이동하십시오.

내가 겪고있는 문제는 컴퓨터의 ping 결과가 "호스트를 찾을 수 없습니다"와 함께 다시 오면 오류 수준을 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가 오프라인 상태입니다"고하고 어쨌든을 제거합니다.

핑 결과가 좋지 않으면 핑 아래의 3 줄을 건너 뛰고 목록에서 다음 반복을 계속할 수 있습니까?

참고 : 저는 Windows 2008에서 Windows 8.1 컴퓨터로 ping을 실행하고 있습니다.

답변

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

실제로 'if! errorlevel! GEQ 1'이 'ErrorLevel 1이면'에 해당하므로 지연된 확장이 필요하지 않습니다 ... – aschipfl

관련 문제