[Batch] Problema con el Quick Batch File Compiler

Iniciado por najmuddin, 29 Junio 2008, 00:09 AM

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

najmuddin

Saludos.

Descargué el Quick Batch File Compiler V 3.1.6.0, le apliqué el parche y me di a la tarea de pasar a .exe uno de los Bats que había hecho...

El .bat funciona perfecto, pero el .exe no... a continuación les dejo el Código Fuente...

@echo off
Mode con Cols=54
set tos=0
echo.
title Apagar el equipo - Temporizador
echo  ****************************************************
echo                  APAGAR EL SISTEMA
echo  ****************************************************
echo.
echo.
set /p priminutos= - Minutos:

for /l %%a in (1,1,1440) do (
If %priminutos%==%%a goto :paso
)

:postpaso
If %tos%==1 goto :correcto

:errora
echo.
echo.
echo  Hubo un error en la ejecucion del comando...
echo.
echo  Tal vez escribio un valor distinto a 1440 (24 horas)
pause>nul
exit

:correcto
set /a minutos=%priminutos%*60
echo.
set /p mensaje= - Mensaje:
set dos= -c
shutdown -s -t %minutos% -c %mensaje%
exit

:paso
set tos=1
goto :postpaso


nota: Bueno, da muchas vueltas innecesarias, pero fueron hechas con la intención de ver si funcionaban para otros casos...

Cuando lo ejecuto como Bat funciona perfecto, pero cuando lo ejecuto como exe, al insertar el primer valor (el número) aparece lo siguiente...

Número no válido . Las constantes numéricas son decimales(17),
hexadecimales(0x11) u octales (021)


pero continúa con la ejecución del programa (aunque ya no funciona)...

¿Qué es lo que pasa si en el BAT original corre perfecto?

Muchas Gracias

-DARAKknight-


carlitos.dll

#1
Ese error que mencionas sucede cuando con set /a asignas un valor que comienza con 0 (que indica que es octal) seguido de un número 8 o 9 (el sistema octal abarca los números de 0 a 7)

es decir si haces esto:

set /a numero=08
te arrojará ese error que mencionas.

por cierto interesante ese comando:
mode con

najmuddin

Gracias, Carlitosdll, pero entonces cómo hago para evitar ese error, ¿no hay una manera de declararlo como decimal?...

Y lo de Mode Con funciona con lines y con cols...

Mode con cols=x
Mode con lines=x


-DARAKknight-


carlitos.dll

#3
definitivamente es problema del compilador, lo probé con la versión que usaste y sucede lo que mencionas. Lo compilé con la versión 2.1.7 y ningún problema.

me tomé la libertad de modificar un poco tu código, para darte otra idea de cómo escribirlo, (como opinabas que daba muchas vueltas :D).


@echo off
rem Mode con Cols=54
:: rem y dos dos puntos es comentado

:start
cls
echo.
title Apagar el equipo - Temporizador
echo  ****************************************************
echo                  APAGAR EL SISTEMA
echo  ****************************************************
echo.
echo.

:ingreso
set priminutos=
set /p priminutos=" - Minutos: "
if "%priminutos%":=="" (goto start)
if %priminutos:~0,1%==0 (goto start)
:: si primera letra es 0 ir a start

set /a priminutos=%priminutos%
::si ocurrio un error queda en 0

setlocal enableextensions
:: comandos de extension habilitados, para el if.

if %priminutos% LEQ 0 (goto errora)
::si priminutos es menor o igual a 0 ir a errora

if %priminutos% GTR 1440 (goto errora)
::si priminutos es mayor a 1440 ir a errora

goto correcto

:errora
cls
::limpiamos rapidamente el error
echo.
echo.
echo  Hubo un error en la ejecucion del comando...
echo.
echo  Tal vez escribio un valor distinto a 1440 (24 horas)
pause>nul
exit

:correcto
set /a minutos=%priminutos%*60
echo.
set /p mensaje=" - Mensaje: "
set mensaje=%mensaje:"=%
::borramos las comillas de mensaje por si colocan encerrado entre comillas.
shutdown -s -t %minutos% -c "%mensaje%"
exit

najmuddin

Muchas Gracias, Carlitosdll, lo de las vueltas era sólo porque quise ver qué era exactamente lo que ocurría (por ejemplo nunca había utilizado el for de esa manera), pero ya que lo modificaste, mucho mejor, aunque me dejaste con varias dudas...

;D

1- ¿Por qué con Cols=54 como comentario?
2- if %priminutos:~0,1%==0 (goto start) --> No lo comprendí muy bien, jeje.
3- set /a priminutos=%priminutos% --> Tampoco lo comprendí bien... ¿Por qué queda en 0 si ocurre un error?
4- setlocal enableextensions No conocía setlocal e ignoro qué son las extensiones...

No sabes lo ignorante que me sentí viendo todo esto...  >:(    :rolleyes:
-DARAKknight-


carlitos.dll

#5
1-lo de cols comentado es solo por gustos, perdona :D.

2-selecciono desde la letra indice 0 hasta n - 1, es decir al colocar (0,1) selecciono desde el indice 0 hasta el indice 1 - 1 es decir de 0 a 0, esto es la primera letra solamente. Entonces, si la variable comienza con 0, (para evitar que sea octal, vamos al comienzo (start)

3-Yo me equivoqué. si en el set /a asignas una letra queda en 0. Pero si ocurre un error, la asignación no ocurre, ahora si la variable existía queda como estaba.

4-si colocas  la ayuda de if (if/?) te dirá que: si los comandos de extensión están habilitados, if cambia así: (... GTR, LEQ) y con setlocal enableextensions habilitas esto.

Puedes leer el post de programación avanzada en batch, y te aseguro que todo te quedará más claro.

BONUS: te regalo un programa que te muestra los contenidos que van tomando las  variables en tiempo de ejecución de los bat, se llama PowerCmd.

http://wikisend.com/download/219636/PowerCmd.rar











najmuddin

Muchas Gracias de Nuevo... Creo que no Hay vez que entre a este Foro y salga sin haber aprendido al menos una sola cosa nueva...

   ;D
-DARAKknight-