No se esperaba 2 en este momento

Iniciado por Pukosito, 15 Mayo 2020, 19:40 PM

0 Miembros y 1 Visitante están viendo este tema.

Pukosito

Hola buenas, profesionales.

Estoy realizando un ejercicio para clases de SIINF y me he encontrado un problema con el control de errores.

Las directrices a seguir son:

1er argumento: Número entero positivo en base decimal.

2º argumento: Número entero positivo que será la base a la que se quiere convertir el primer argumento. Bases admitidas: [2, 16]

Se debe realizar control de errores.

Hasta el punto donde estoy solo me sale el STDOUT que quiero cuando pongo los dos argumentos, pero no me salen los STDERR deseados cuando no pongo algún parámetro de entrada.

En su lugar me sale que no se espera un 2.

Código:

if "%1" == "" (
echo No ha sido introducido un primer argumento.
echo Por favor, debe introducir dos argumentos para comenzar la ejecucion del script.
goto :fin
) else (
    if "%2" == "" (
       echo No ha sido introducido un segundo argumento.
       echo Por favor, debe introducir dos argumentos para comenzar la ejecucion del script.
       goto :fin
    ) else (
       if not "%3" == "" (
          echo Ha sido introducido un tercer argumento.
          echo Por favor, debe introducir solamente dos argumentos para comenzar la ejecucion del script.
          goto :fin
       ) else (
          set "arg1="&for /f "delims=0123456789" %%i in ("%1") do set arg1=%%i
          if defined arg1 (
             echo El primer argumento a introducir debe ser un entero y ademas positivo.
             goto :fin
          ) else (
             set "arg2="&for /f "delims=0123456789" %%j in ("%2") do set arg2=%%j
             if defined arg2 (
                echo El segundo argumento a introducir debe ser un entero y ademas positivo.
                goto :fin
             ) else (
                if %2 LSS 2 (
                   echo Ha introducido como segundo argumento un numero menor de 2.
                   echo Debe introducir como segundo parametro un numero entre 2 y 16.
                   goto :fin     
                ) else (
                   if %2 GTR 16 (
                      echo Ha introducido como segundo argumento un numero mayor de 16.
                      echo Debe introducir como segundo parametro un numero entre 2 y 16.
                      goto :fin
                   ) else (
                      echo Los argumentos han sido correctamente introducidos.
                      echo.
                   )
                )
             )
          )
       )
    )
)
:fin
echo.
echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
echo + Gracias por utilizar nuestro script: %0 +
echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pause
cls


STDERR (cuando no pongo 1 o los 2 argumentos)

No se esperaba 2 en este momento.


Muchas gracias de antemano :)

.:Xx4NG3LxX:.

Utiliza un título más explícito, coloca el lenguaje entre corchetes [ y ].
"Quizá Batch no sea un lenguaje de programación, pero no obstante deja de ser útil. Asi que no anden diciendo «Que ganas de perder el tiempo»"



EdePC

Saludos,

- En tus últimos IF estás haciendo referencia a %2 y pues Batch hace una primera pasada para reemplazar variables, por ejemplo si yo llamo al batch.bat 1 2 3 primero se revisará todo el "programa" actualizando/reemplazando las variables dadas 1 2 3 con %1 %2 %3 respectivamente, luego hace otra pasada para ver si el código no tiene errores y pues tu IF queda malformado si no hay segundo parámetro: IF LSS 2 esto provoca un error fatal.

- Para que no quede vació y no interfiera con la comparación de dos números puedes anteponer un +: IF +%2 LSS 2, o puedes poner un número delante o detrás de ambos miembros: IF %20 LSS 20 IF 5%2 LSS 52, en este último caso puedes tener problemas si antepones el 0 porque esto denotaría un número Octal.

- También podrías evitarte tanto paréntesis ya que estás utilizando saltos exclusivos:

Código (dos) [Seleccionar]
@echo off

if [%1]==[] (
  echo No ha sido introducido un primer argumento.
  echo Por favor, debe introducir dos argumentos para comenzar la ejecucion del script.
  goto :fin
)
if [%2]==[] (
  echo No ha sido introducido un segundo argumento.
  echo Por favor, debe introducir dos argumentos para comenzar la ejecucion del script.
  goto :fin
)
if not [%3]==[] (
  echo Ha sido introducido un tercer argumento.
  echo Por favor, debe introducir solamente dos argumentos para comenzar la ejecucion del script.
  goto :fin
)
set "arg1=" & for /f "delims=0123456789" %%i in ("%1") do set arg1=%%i
if defined arg1 (
  echo El primer argumento a introducir debe ser un entero y ademas positivo.
  goto :fin
)
set "arg2=" & for /f "delims=0123456789" %%j in ("%2") do set arg2=%%j
if defined arg2 (
  echo El segundo argumento a introducir debe ser un entero y ademas positivo.
  goto :fin
)
if %20 LSS 20 (
  echo Ha introducido como segundo argumento un numero menor de 2.
  echo Debe introducir como segundo parametro un numero entre 2 y 16.
  goto :fin
)
if %20 GTR 160 (
  echo Ha introducido como segundo argumento un numero mayor de 16.
  echo Debe introducir como segundo parametro un numero entre 2 y 16.
  goto :fin
)

echo Los argumentos han sido correctamente introducidos.
echo.

:fin
  echo.
  echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  echo + Gracias por utilizar nuestro script: %0 +
  echo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  pause
  cls