Se puede simplificar el code... pero ahí está mi intento... Deberías identar tu code...
			Código (dos) [Seleccionar] 
::Cuenta atrás
::Batchiano
@echo off
setlocal enabledelayedexpansion
:menu
set /p h="Horas: "
set /p m="Minutos: "
set /p s="Segundos: "
for %%z in (h,m,s) do if not defined %%z (
	call :formato
)
if %h% GEQ 0 (
	if %m% GEQ 0 (
		if %m% LEQ 59 (
			if %s% GEQ 0 (
				if %s% LEQ 59 (
					call :contador
				) else (
					call :formato
				)
			) else (
				call :fomato
			)
		) else (
			call :formato
		)
	) else (
		call :formato
	)
) else (
	call :formato
)
goto :eof
 
:contador
cls
if %h% GEQ 0 (
	if %m% GEQ 0 (
		if %s% GEQ 0 (
			for /l %%a in (!h!,-1,0) do (
				for /l %%b in (!m!,-1,0) do (
					for /l %%c in (!s!,-1,0) do (
						echo Contador: %%a:%%b:%%c
						ping localhost -n 2 > nul
						cls
					)
					set s=59
				)
				set m=59
			)
		)
	)
)
goto :eof
 
:formato
echo Formato incorrecto. Vuelva a intentarlo
pause>nul & cls & call :menu
