I wrote a post yesterday about testing your internet connectivity using a Windows batch file, but since I cannot leave well-enough alone, I decided to keep working on it.
A few things to keep in mind…
- The line “set ESC=” ends with a non-printable ASCII ESC character (ASCII 27; Hexadecimal 0x1B) that may not be visible in your browser. Editors like Notepad++ show non-printable characters.
- If you add “hosts” you should also add “names” – hosts entry will be displayed otherwise.
- hosts index should start at zero with no sequence gaps
- The “for” loop’s “end” should match count(hosts + 1)
Here is my finished code…
@echo off cls rem ANSI Colors set ESC= set red=%ESC%[31m set green=%ESC%[32m set default=%ESC%[0m rem Domain names or IPs set hosts[0]=192.168.0.1 set hosts[1]=google.com set hosts[2]=bing.com rem Human-friendly names (optional) set names[0]=Router set names[1]=Google set names[2]=Bing :startover set /p "hosts[0]=Router IP address or [ENTER] for default (%hosts[0]%): " :loophosts echo, echo Checking hosts... echo, for /l %%i in (0,1,3) do ( call :pinghost %%i ) echo, choice /M "Check hosts again?" if %errorlevel% == 1 goto :startover exit /B %errorlevel% :pinghost setlocal EnableDelayedExpansion set j=%~1 @ping !hosts[%j%]! -n 1 -w 1000 | FIND "TTL=" >nul if %errorlevel% == 0 ( if "!names[%j%]!" == "" ( echo !hosts[%j%]!: %green%Online%default% ) else ( echo !names[%j%]!: %green%Online%default% ) ) else ( if "!names[%j%]!" == "" ( echo !hosts[%j%]!: %red%OFFLINE%default% ) else ( echo !names[%j%]!: %red%OFFLINE%default% ) ) exit /B 0
A better way to set up the ANSI char would be as follows:
for /F “tokens=1,2 delims=#” %%a in (‘”prompt #$H#$E# & echo on & for %%b in (1) do rem”‘) do (
set ESC=%%b
exit /B 0
)
You can then simply use something like this:
echo. %ESC%[31mERROR%ESC%[30m
or is you still want to keep your vars then:
echo. %red%ERROR%default%
For example:
@echo off &cls
setlocal
rem ANSI Colors
call :setESC
set red=%ESC%[31m
set green=%ESC%[32m
set default=%ESC%[0m
rem Domain names or IPs
set hosts[0]=192.168.0.1
set hosts[1]=google.com
set hosts[2]=bbc.co.uk
rem Human-friendly names (optional)
set names[0]=Router –
set names[1]=Google –
set names[2]=BBC –
:startover
set /p “hosts[0]=Router IP address or [ENTER] for default (%hosts[0]%): ”
:loophosts
echo,
echo Checking hosts…
echo,
REM If you add more hosts above then alter the following to match:
for /l %%i in (0,1,2) do (
call :pinghost %%i
)
echo,
choice /M “Check hosts again?”
if %errorlevel% == 1 goto :startover
exit /B %errorlevel%
:pinghost
setlocal EnableDelayedExpansion
set j=%~1
@ping !hosts[%j%]! -n 1 -w 1000 | FIND “TTL=” >nul
if %errorlevel% == 0 (
if “!names[%j%]!” == “” (
echo !hosts[%j%]! %green%Online%default%
) else (
echo !names[%j%]! %green%Online%default%
)
) else (
if “!names[%j%]!” == “” (
echo !hosts[%j%]! %red%OFFLINE%default%
) else (
echo !names[%j%]! %red%OFFLINE%default%
)
)
exit /B 0
:setESC
for /F “tokens=1,2 delims=#” %%a in (‘”prompt #$H#$E# & echo on & for %%b in (1) do rem”‘) do (
set ESC=%%b
exit /B 0
)
Didn’t run your code, but looks okay to me. Always open to alternative methods. Thanks!