Manejador de error en BAT

Quisiera saber cómo poder manejar errores del sistema en un archivo BAT, le comento además que estoy usando el %ERRORLEVEL% para manejar otro tipo de errores pero no se cuál es la sintaxis para manejar errores del sistema como el 86.

1 respuesta

Respuesta
1

No tengo muy claro lo que dices pero imagino que el error correspondiente será la respuesta del sistema al intento de ejecución de un comando y que puedes capturar esa respuesta e intentar identificar el error. Sería bueno intentar trabajar sobre un caso concreto y luego podríamos probar a generalizarlo. Por lo que he visto el error 86 del que hablas puede la respuesta del sistema a un comando NET USE cuando la contraseña proporcionada no es la correcta. Si fuera así supongo que podría intentar simularlo y a partir de ahí ver que es lo que necesitas y como conseguirlo.

Lo siento por no dejarme entender, actualmente estoy usando la palabra reservada %ERRORLEVEL% para manejar errores y hasta donde he podido investigar por ejemplo cuando sucede un error como que la contraseña de conexión a una unidad de red no coincide ahí se muestra el mensaje de "error del sistema" el cual no es manejado con %ERRORLEVEL%, también hasta donde investigué no hay palabra reservada dentro de un BAT que maneje este error por eso ahora he decidido manejar una variable que me indique si hubo un error o no, por favor ayúdeme y explíqueme ya que tengo problemas al definir la variable y asignarle el nuevo valor cuando cumple la condición, más o menos lo tengo así

REM VARIABLE POR DEFECTO EN CERO

SET ERROR_SYSTEMA=0

IF NOT EXIST Z:\ (SET ERROR_SYSTEMA=1)

por favor ayúdeme con la sintaxis ya que no me cumple lo que deseo.

Gracias.

Si te entiendo bien tu consulta tiene dos aspectos. El primero sería como asignar un valor a una variable y comprobar que se ha asignado correctamente. Tu ejemplo de arriba debe funcionar pero yo añadiría un comando de echo para visualizar el valor de la variable. Te copio lo que me sale:

D:\BAT>type vs.bat
@echo off
set error_sistema=0
if not exist z:\ (set error_sistema=1)
echo la variable vale %error_sistema%
D:\BAT>vs
la variable vale 1
D:\BAT>

Puedes ver, gracias al comando type, que el contenido de vs.bat es prácticamente el que tú sugieres. Y también puedes ver que la variable error_sistema ha tomado el valor 1 al no existir la unidad Z:

Otro aspecto es el que dices del errorlevel. No sé si lo estás tratando adecuadamente. Mira este otro ejemplo:

D:\BAT>type vs.bat
@echo off
set error_sistema=0
if not exist z:\ (set error_sistema=1)
echo la variable vale %error_sistema%
net use z: \\192.168.1.33\users
if errorlevel 2 echo ha dado error
if exist z:\ (set error_sistema=0)
echo la variable vale %error_sistema%
D:\BAT>vs
La variable vale 1
Se ha completado el comando correctamente.
La variable vale 0
D:\BAT>vs
La variable vale 0
Error de sistema 85.
Ya se está utilizando el nombre del dispositivo local.
Ha dado error
La variable vale 0

Aquí puedes ver que he complicado un poco el ejemplo incluyendo un NET USE y analizando mediante errorlevel si ha dado error. En la primera ejecución del vs.bat el comando NET USE funciona correctamente, asigna algo a la unidad Z: por lo que tras el NET USE la variable error_sistema pasa a valer 0 y el comando del ERRORLEVEL no se ejecuta. La segunda ejecución del vs.bat pretende volver a asignar algo a la misma unidad, lo que provoca el error 85 detectado por el ERRORLEVEL.

Espero que esto te ayude. Pero si necesitas más aclaraciones no dudes en seguir preguntando. En la medida en que mis conocimientos me lo permitan intentaré responder.

Muchas gracias experto por su ayuda, ahora quisiera hacerle la siguiente consulta, tengo un mensaje de pregunta en el cual las respuestas son alguna de las letras (s, S, n, N) y me percato que si por error presiono enter el programa termina repentinamente, cómo hago para capturar el enter y manejarlo para que no haga nada.

Gracias.

Prueba con algo así:

@echo off
set resp=p
:Bucle
Cls
set /p resp=¿Hago algo (sS/nN)?:
if %resp%==s goto si
if %resp%==S goto si
if %resp%==n goto no
if %resp%==N goto no
goto :bucle
:Si
Echo Has contestado que si
goto fin
:No
Echo Has contestado que no
:Fin

Muchas gracias por su ejemplo, acabo de percatarme de una diferencia y quisiera que me explique, ud. en su ejemplo indica goto :bucle, le comento que yo estuve haciendo algo similar pero lo mio era sin los dos puntos, osea así goto bucle, y me acabo de dar cuenta que al ponerle los dos puntos trabaja bien y sin los dos puntos se cerraba el programa, tenía pensado que cuando se define una etiqueta la sintaxis es así :Etiqueta y que cuando se llama se usa GOTO Etiqueta sin los dos puntos, por favor explíqueme como es.

Gracias.

Estoy haciendo pruebas con el programa y me doy cuenta que lo anterior que le consultaba creo que no tiene nada que ver ya que le comento lo siguiente, en la primera prueba cuando le doy enter se cierra el programa, en la segunda prueba cuando presiono S de si y si luego cuando vuelvo a tener la pregunta presiono Enter me vuelve a repetir el menu lo cual está bien, es decir al parecer en la primera corrida la variable como no tiene asignado anteriormente nada y si presiono Enter se cierra, pero si primero presione una letra al parecer queda grabado esa letra en la variable y cuando por segunda vez presiono Enter toma el dato grabado anteriormente mas no la del Enter por eso repite el menu, espero dejarme entender.

A diferencia de su ejemplo yo lo estoy definiendo asi:

:MENSAJE_ERROR
CLS
COLOR 0C

SET /P VAR=Antes de reiniciar la PC, desea volver a tratar de conectarse (S/N):
IF %VAR% EQU s GOTO ENCABEZADO_INICIANDO_CONEXION
IF %VAR% EQU S GOTO ENCABEZADO_INICIANDO_CONEXION
IF %VAR%==n GOTO SALIR
IF %VAR%==N GOTO SALIR
CLS
ECHO *****************************************************************************
ECHO *** Ingreso un caracter invalido, recuerde que solo puede ingresar alguno ***
ECHO *** de los caracteres siguientes (s, S, n, N) intentelo nuevamente. ***
ECHO *****************************************************************************
ECHO.
PAUSE
GOTO MENSAJE_ERROR

Otra pregunta también es que por ejemplo cuando estoy en la pregunta si deseo volver a conectarme y si presiono barra espaciadora y luego enter se cierra el programa, cómo puedo hacer para controlar esos errores.

Gracias.

He retocado tu BAT para que funcione como creo que esperas:

:MENSAJE_ERROR
CLS
COLOR 0C
SET VAR=P
SET /P VAR=Antes de reiniciar la PC, desea volver a tratar de conectarse (S/N):
IF "%VAR%" EQU "s" GOTO ENCABEZADO_INICIANDO_CONEXION
IF "%VAR%" EQU "S" GOTO ENCABEZADO_INICIANDO_CONEXION
IF "%VAR%"=="n" GOTO SALIR
IF "%VAR%"=="N" GOTO SALIR
CLS
ECHO *****************************************************************************
ECHO *** Ingreso un caracter invalido, recuerde que solo puede ingresar alguno ***
ECHO *** de los caracteres siguientes (s, S, n, N) intentelo nuevamente.       ***
ECHO *****************************************************************************
ECHO.
Pause
GOTO MENSAJE_ERROR

Tal como decías si tecleas Enter sin más, mantiene el valor anterior de la variable (que se guarda en el "entorno", puedes ver el valor de la variable si tecleas SET sin parámetros en una ventana MSDOS). Para evitarlo es para lo que he introducido el comando "SET VAR=P" (obviamente el valor puede ser cualquiera distinto de S y N). Y las peculiaridades de la programación/interpretación BAT hacen que si la variable tiene  como valor "espacio" (resultado de teclear la barra espaciadora seguida de Enter) cualquiera de los IF %VAR% se trata como si hubiera un espacio entre el IF y lo que sigue, lo que da lugar a un mensaje de error del tipo "No se esperaba ... en este momento" o  "La sintaxis del comando no es correcta". Para evitarlo se rodea a la propia variable y la cadena a comparar de unos caracteres fijos (en este caso he utilizado las comillas pero pueden ser otros, aunque se use el que se use para esta función dará el correspondiente problema si se teclea en la respuesta)

Maestro muchas gracias por su tiempo y ayuda, todo salió bien.

Gracias.

Creo que está claro que ya quedó resuelto el asunto, pero la página me indica que está pendiente de responder, por eso envío esta "respuesta" pero no es necesario que hagas nada. Es solo para que la página se quede "tranquila".

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas