ayuda crear consola batch sin que se cierre al llegar al ultimo comando

Iniciado por erickesau, 11 Mayo 2015, 05:50 AM

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

erickesau

estoy creando una consola la cual al llamarla ejecute comando como cualquier consola

ejemplo la consola se llama esau.cmd y la voy a invocar desde un archivo batch
el problema es que cuando la consola llega al final el archivo batch se cierra tambien y no continua con el siguiente comando.
la unica forma de que funcione es llamando con el comando call pero entonces no funcionaria como consola.


hay alguna forma de hacerla funcionar gracias desde ya  :rolleyes:.




archivo.bat
Código (DOS) [Seleccionar]

@echo off
esau.cmd milogo.bmp
echo el batch se cierra antes de llegar aqui.
pause






consola
esau.cmd
Código (DOS) [Seleccionar]

@echo off
color 0a
if -%1-==-- (goto regular) else (goto noregular)



:noregular
if "%~x1"==".ico" goto ico
if "%~x1"==".bmp" goto bmp

echo el formato de la imagen no es aceptable use ico para el icono o bmp para el logo.
echo asegurese de no incluir coma , en el nombre de la imagen puede causar este mensaje.
pause
exit /b

:regular
set /p archivo= arrastra el icono o el logo y sueltelo aqui luego presione enter:

set "esau=%archivo:"=-%"
if "%esau:~-5%" == ".bmp-" goto bmp
if "%esau:~-4%" == ".bmp" goto bmp
if "%esau:~-5%" == ".ico-" goto ico
if "%esau:~-4%" == ".ico" goto ico


cls
echo el formato de la imagen no es aceptable use ico para el icono o bmp para el logo
pause
exit /b







:ico
echo icono
pause


goto fin

:bmp
echo logo
pause
:fin
:::::al llegar a esta parte se cierra no regresa al batch desde donde lo invoque
:::::si lo llamo con el comando call si funcionara correctamente


Mod: tema movido, esto no es una duda general

Eleкtro

1. Esto es muy incorrecto:
Citar
Código (dos) [Seleccionar]
if -%1-==-- (goto regular) else (goto noregular)

Para prevenir un argumento vacio, lo expandes para eliminarle comillas dobles, y le añades tú las comillas dobles:
Código (dos) [Seleccionar]
if "%~1" EQU "" (goto :regular) else (goto :noregular)

2. El código que mostraste, en mi caso si que termina la ejecución del script de la forma que deseas ...volviendo al script que lo invocó, así que no puedo reproducir el error de diseño que comentas, pero de todas formas corregí algunas pequeñas cosas para seguir buenas prácticas de uso, prueba así:
Código (dos) [Seleccionar]
@echo off
color 0a

:: Argument Handling.
If "%~1" EQU "" (
goto :regular
) else (
goto :noregular
)

:NoRegular
If /i "%~x1" EQU ".ico" (
GoTo :ico
)

If /i "%~x1" EQU ".bmp" (
GoTo :bmp
)

Echo: el formato de la imagen no es aceptable use ico para el icono o bmp para el logo.
Echo: asegurese de no incluir coma , en el nombre de la imagen puede causar este mensaje.
Exit /B 1

:Regular
Set /p "archivo= arrastra el icono o el logo y sueltelo aqui luego presione enter:"

Set "esau=%archivo:"=-%" & REM "
If /I "%esau:~-5%" EQU ".bmp-" (GoTo :bmp)
If /I "%esau:~-4%" EQU ".bmp"  (GoTo :bmp)
If /I "%esau:~-5%" EQU ".ico-" (GoTo :ico)
If /I "%esau:~-4%" EQU ".ico"  (GoTo :ico)

CLS
Echo: el formato de la imagen no es aceptable use ico para el icono o bmp para el logo
Exit /B 1

:ico
Echo icono
Pause&Exit /B 0

:bmp
Echo logo
Pause&Exit /B 0


Saludos








erickesau


erickesau

#3
encontre la forma de usar una consola hecha en batch sin que se nos cierre el archivo con el cual la invocamos  ;-)

lo que debemos de hacer es anteponer el comando cmd /c   antes de llamar la consola

ejemplo la consola se llama esau.cmd  la invocare asi:  cmd /c esau [comando][comando]

cmd /c consola.cmd [comando][comando]

el siguiente archivo bat extraera todos los archivos de una carpeta y subcarpetas y los guardara en una sola carpeta  para eso tendra que llamar a la consola esau.cmd



@echo off

cmd /c esau extraer C:\micarpeta -/a/- C:\mi nueva carpeta

echo listo se extrayeron los archvivos de la carpeta y subcarpetas
pause
exit



tambien aqui esta otro ejemplo
@echo off
title archivo bat de prueba
set /p ru= hola escribe la ruta de la carpeta que quieres extraerle los archivos:
cls
set /p des= hora escribe la ruta de destino :

cmd /c esau extraer %ru% -/a/- %des%

echo listo se extrayeron los archvivos de la carpeta y subcarpetas
pause
exit



y esta es la consola que por hora solo le e agregado un comando.
@Echo OFF & SetLocal EnableDelayedExpansion
title erick esau cmd consola



if "%~1"=="help /?" goto :ayuda
if "%~1"=="help" goto :ayuda
if "%~1"=="help/?" goto :ayuda
if "%~1"=="" goto :ayuda

if "%~1"=="extraer" goto :extraer

goto :ayuda


:: extractor
:extraer
set "todo=%*"
set "buscar=%todo:"=%"

set "num=0"
:menu
set /a "num=%num% + 1"
if "!buscar:~%num%,7!"==" -/a/- " (
   goto :listo
)
goto menu

:listo




set /a "num2=%num% - 8"
set /a "num3=%num% + 7"

set "ruta=!buscar:~8,%num2%!
set "destino=!buscar:~%num3%,9999!





:: Extractor de archivos
@Echo OFF
if not exist "%destino%" md "%destino%"

::saca una lista pasa cada linea de texto por el bucle y comprueba si existe en el destino, si existe lo renombra como nombre copia+fecha+hora+numero variable y luego mueve el nuevo archivo

for /f "tokens=* delims=" %%a in ('dir /a:-d /s /b "%ruta%"') do (if exist "%destino%\%%~nxa" ren "%destino%\%%~nxa" "%%~na Copia %date:/=-%-%time::=-%-%random% %%~xa" && move "%%~a" "%destino%")

::los archivos que tenian el mismo nombre ya se renombraron y se movieron los nuevos archivos que tenian el mismo nombre, ahora se movera el resto
for /f "tokens=* delims=" %%a in ('dir /a:-d /s /b "%ruta%"') do (move "%%~a" "%destino%")

cls
echo listo se extrayeron los archivos
echo de %ruta%
echo a %destino%
exit /b


:::proximamente mas funciones...










:ayuda
cls
echo uso:
echo cmd /c esau [comandos]
echo.
echo cmd /c esau help /?             muestra un mensaje de ayuda
echo.
echo extraer    le indica a la consola que ejecute el comando de extraer
echo -/a/-      lo que esta antes de este comando se toma como objetivo y lo que esta despues como destino
echo.                    
echo ejemplos
echo.
echo el siguiente comando extraera todos los archivos de "micarpeta" y subcarpetas y los movera a (micarpeta2)
echo llamadolo desde otro batch de la siguiente manera como una consola pero anteponemos el comando cmd /c
echo.
echo cmd /c esau extraer micarpeta -/a/- micarpeta2
echo.
echo el comando cmd /c se utiliza antes de invocar a la consola esau ya que en la programacion batch
echo si invocamos a otro bat en modo consola ejecutara las acciones correctamente pero al terminar tambien terminara al batch que lo a llamado.
exit /b



:::podemos enviarle variables a la consola pero la consola no puede estableser variables para el batch desde donde lo llamamos porque la consola se abrira en la misma ventana pero como un proceso independiente.











y para quienes les guste el extractor de archivos y quieren usarlo como archivo batch normal aqui esta
@echo off
title extractor de archivos de multiples carpetas v1.0
if not "%~1"=="" (
   color 0a
) else (
   echo no es necesario abrir este bat solo arrastra la carpeta y dejala caer sobre el archivo %~nx0 && echo presiona una tecla para salir && pause>nul && exit
)

echo quiere extraer todo de %*
echo presione S para extraer su contenido
choice /c s
if "%errorlevel%"=="1" (goto :empezar)
exit
:empezar
md extraido-temp56644..h-.h5a.b1
set "erickesau=%cd%\extraido-temp56644..h-.h5a.b1"
::saca una lista pasa cada linea de texto por el bucle y comprueba si existe en el destino, si existe lo renombra como nombre copia+fecha+hora+numero variable y luego mueve el nuevo archivo

for /f "tokens=* delims=" %%a in ('dir /a:-d /s /b %*') do (if exist "%erickesau%\%%~nxa" ren "%erickesau%\%%~nxa" "%%~na copia %date:/=-%-%time::=-%-%random% %%~xa" && move "%%~a" "%erickesau%")

::los archivos que tenian el mismo nombre ya se renombraron y se movieron los nuevos archivos que tenian el mismo nombre, ahora se movera el resto
for /f "tokens=* delims=" %%a in ('dir /a:-d /s /b %*') do (move "%%~a" "%erickesau%")


echo Presiona una tecla para salir
pause>nul
exit



:::creado por erick esau para extrer todos los archivos de una carpeta y subcarpetas
:::solo arrastrar la carpeta y dejarla caer sobre este archivo bat no es nesesario que este abierto se abrira al caer la carpeta sobre el.