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.