Antes de nada aclararte que, aunque yo lo uso mucho porque mi dominio de batch supera por mucho mi dominio de otro lenguaje, para cosas como las que quieres hacer batch se queda corto.
Aun asi:
¿Porque se ejecuta la etiqueta reinicio antes de cometer ningun fallo?
Batch se ejecuta linea a linea.
Por eso usar "call" no es buena idea porque se suele hacer:
IF condicion CALL :menu
pero resulta que no estás controlando que si el IF no cumple condicion, no vaya a :menu y entonces a donde va? a la linea siguiente.
En definitiva: lo ideal es controlar si has entrado al IF o al ELSE justo después de un CALL para saber si ha habido errores.
Otra opción es usar las variables llamadas ERRORLEVEL.
Tambien con goto:eof si se habia usado call, regresas a la posicion "original".
Para acabar, siendo que hay trozos de código en VBS, yo quizás probaria a aprender algo más de VBS (saber 1 poco es facil) y hacerlo todo en VBS.
En cuanto a reply.exe creo que se utiliza para leer alguna tecla especial como enter ya que:
:inicio
reply.exe
Si Errorlevel=13 quiere decir que la letra es la correcta para salir del bucle. Además, creo que sirve para, en función del codigo ASCII que retorne Errorlevel, saber qué letra ha pulsado el usuario. Lo que no sé es si no hay formas más elegantes de hacerlo.
PS: vale, si, hace eso si no me equivoco, buscar en memoria la tecla pulsada y almacenarla, pero con ASM
mas informacion:
http://thestarman.pcministry.com/asm/debug/debug.htm#EXE