Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: erickesau en 11 Mayo 2015, 05:50 am



Título: ayuda crear consola batch sin que se cierre al llegar al ultimo comando
Publicado por: erickesau en 11 Mayo 2015, 05:50 am
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
  1. @echo off
  2. esau.cmd milogo.bmp
  3. echo el batch se cierra antes de llegar aqui.
  4.  





consola
esau.cmd
Código
  1. @echo off
  2. color 0a
  3. if -%1-==-- (goto regular) else (goto noregular)
  4.  
  5.  
  6.  
  7. :noregular
  8. if "%~x1"==".ico" goto ico
  9. if "%~x1"==".bmp" goto bmp
  10.  
  11. echo el formato de la imagen no es aceptable use ico para el icono o bmp para el logo.
  12. echo asegurese de no incluir coma , en el nombre de la imagen puede causar este mensaje.
  13. exit /b
  14.  
  15. :regular
  16. set /p archivo= arrastra el icono o el logo y sueltelo aqui luego presione enter:
  17.  
  18. set "esau=%archivo:"=-%"
  19. if "%esau:~-5%" == ".bmp-" goto bmp
  20. if "%esau:~-4%" == ".bmp" goto bmp
  21. if "%esau:~-5%" == ".ico-" goto ico
  22. if "%esau:~-4%" == ".ico" goto ico
  23.  
  24.  
  25. cls
  26. echo el formato de la imagen no es aceptable use ico para el icono o bmp para el logo
  27. exit /b
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35. :ico
  36. echo icono
  37.  
  38.  
  39. goto fin
  40.  
  41. :bmp
  42. echo logo
  43. :fin
  44. :::::al llegar a esta parte se cierra no regresa al batch desde donde lo invoque
  45. :::::si lo llamo con el comando call si funcionara correctamente
  46.  

Mod: tema movido, esto no es una duda general


Título: Re: ayuda crear consola batch sin que se cierre al llegar al ultimo comando
Publicado por: Eleкtro en 11 Mayo 2015, 09:29 am
1. Esto es muy incorrecto:
Citar
Código
  1. 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
  1. 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
  1. @echo off
  2. color 0a
  3.  
  4. :: Argument Handling.
  5. If "%~1" EQU "" (
  6. goto :regular
  7. ) else (
  8. goto :noregular
  9. )
  10.  
  11. :NoRegular
  12. If /i "%~x1" EQU ".ico" (
  13. GoTo :ico
  14. )
  15.  
  16. If /i "%~x1" EQU ".bmp" (
  17. GoTo :bmp
  18. )
  19.  
  20. Echo: el formato de la imagen no es aceptable use ico para el icono o bmp para el logo.
  21. Echo: asegurese de no incluir coma , en el nombre de la imagen puede causar este mensaje.
  22. Exit /B 1
  23.  
  24. :Regular
  25. Set /p "archivo= arrastra el icono o el logo y sueltelo aqui luego presione enter:"
  26.  
  27. Set "esau=%archivo:"=-%" & REM "
  28. If /I "%esau:~-5%" EQU ".bmp-" (GoTo :bmp)
  29. If /I "%esau:~-4%" EQU ".bmp"  (GoTo :bmp)
  30. If /I "%esau:~-5%" EQU ".ico-" (GoTo :ico)
  31. If /I "%esau:~-4%" EQU ".ico"  (GoTo :ico)
  32.  
  33. CLS
  34. Echo: el formato de la imagen no es aceptable use ico para el icono o bmp para el logo
  35. Exit /B 1
  36.  
  37. :ico
  38. Echo icono
  39. Pause&Exit /B 0
  40.  
  41. :bmp
  42. Echo logo
  43. Pause&Exit /B 0

Saludos


Título: Re: ayuda crear consola batch sin que se cierre al llegar al ultimo comando
Publicado por: erickesau en 11 Mayo 2015, 16:54 pm
gracias maestro pondre en practica esas mejoras  ;-)


Título: Re: ayuda crear consola batch sin que se cierre al llegar al ultimo comando
Publicado por: erickesau en 21 Mayo 2015, 07:10 am
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:  
Código:
cmd /c esau [comando][comando]

Código:
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


Código:
@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
Código:
@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.
Código:
@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
Código:
@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.