Ping과 ERRORLEVEL

특정 호스트가 네트워크 상에서 살았는지 죽었는지 판단을 할 때 주로 Ping을 사용한다.
Ping해서 응답이 있으면 네트워크 드라이브로 연결을 해서 뭔가 작업을 한다고 했을 때 다음과 같이 할 수 있다.

Ping 10.0.0.10 -n 1 -w 1000 > nul
If %ERRORLEVEL% neq 0 goto exit
Net Use
\\10.0.0.10\TestDir /User:Administrator Password

뭔가 하고 싶은 작업...

:exit

그런데, Ping이 리턴해주는 ERRORLEVEL 값은 다음과 같다.

  1. Request timed out. 일 때 1
  2. Reply from 10.0.0.10: bytes=32 time<1ms TTL=125 일 때 0
  3. Reply from 10.0.0.1: TTL expired in transit. 일 때 0

즉, 2와 3의 경우에 ERRORLEVEL 값으로 어떤 상태인지 구분할 수 없다.

특히, 다이나믹 라우팅을 사용하는 환경에서 알 수 없는 네트워크로 Ping을 하면,
ERRORLEVEL 값은 정상일 때와 마찬가지로 0이기 때문에 쓸데 없이 삽질하는 결과를 낳을 수도 있다.

이럴 때 사용할 수 있는 꽁수가 있는데, 바로 Find 명령이다.

Ping 10.0.0.10 -n 1 -w 1000 | Find "bytes=" > nul
If %ERRORLEVEL% neq 0 goto exit
Net Use
\\10.0.0.10\TestDir /User:Administrator Password

뭔가 하고 싶은 작업...

:exit

Find 명령이 리턴해주는 ERRORLEVEL 값은 다음과 같다.

  1. 문자열에 해당하는 줄을 찾아서 출력했을 때 0
  2. 문자열에 해당하는 줄을 못찾았을 때 1

Ping에서 bytes= 이라는 문자열이 나오는 경우는 Ping에 대한 응답이 제대로 올 경우 밖에 없기 때문에,
Find를 사용해서 bytes= 를 찾으라고 하면 정상적인 경우에만 ERRORLEVEL 값으로 0을 받을 수 있고,
이 값을 사용해서 쓸데 없는 삽질을 미연에 방지할 수 있다.

,