Borrar archivo con nombre del directorio. BATCH

Iniciado por Dany3j, 20 Julio 2011, 21:45 PM

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

Dany3j

hello de nuevo..

Esto tratando de hacer algo un poco facil pero la verdad no logro como empezar

Quiero crear una utilidad que borrer un archivo.exe  dentro de una carpeta solo si el archivo tiene el mismo nombre que el directorio en el que se encuentra y solo si es menor de 500kb

por ejemplo.

Tengo en C:/test/

el archivo test1.exe y test.exe en esta ocacion borraria la solo test.exe si es menor a 500kb

pero a su vez hay una carpeta llamada test1/  dentro de test/ que contiene un archivo test1.exe menor a 500kb que debe borrarlo tambien sin afectar los otros archivos que esten dentro de los directorio.

Una vez terminado de borrar imprimir los archivo borrados menores de 500kb y los no borrados menores de un 1000kb asi como tambien mostrar...

Noc a mi me parece un poco dificil por eso no he adjuntado ningun codigo.
"Pensando en Batch" XD

SuperDraco

#1
Hombre, el nivel de ese ejercicio no es tán básico xD

Te he echo este script, a ver que te parece...  :P

EDITO: no se si leiste mi comentarió,pero he tardado un poco más en corregir unos errores que tenía xD, siento la demora...





Bueno, espero que te sirva, al menos como idea  ;)

PD: Para usar mi script en subdirectorios, debes usar "DIR /B /S" y cambiar y añadir unas cosas más para filtrar los nombres largos, pero bueno, eso te lo dejo a ti, ya me lo he currado bastante y no es plan de hacertelo como deseas al 100%  :xD






Código (dos) [Seleccionar]
@echo off
Title www.ElHacker.net





REM By PiToLoKo
REM Visita: Foro.ElHacker.Net





REM Seteamos la ruta de trabajo
Set Ruta=C:\test





REM Creamos las listas de archivos...

Echo Archivos Borrados inferiores a 500 KB:>"%temp%\Borrados.txt"
echo+ >>"%temp%\Borrados.txt"

Echo Archivos No borrados inferiores a 1024 KB (1 MB):>"%temp%\NO Borrados.txt"
echo+ >>"%temp%\NO Borrados.txt"





REM Buscamos los archivos dentro de la ruta

PUSHD "%ruta%\"

For /F "tokens=*" %%a in ('dir /B /A-D "%ruta%"') do (
Set archivo=%%a
Set Bytes=%%~za
Call :Carpeta
)

Goto :Fin





REM Comprobamos si el nombre del archivo es igual al de la ruta

:Carpeta

Dir ".." /B /A:D | find "%archivo:~-0,-4%" >NUL

If %ERRORLEVEL% EQU 0 (
Call :Same__Name_Size
Goto:eof
) ELSE (
Call :Not_same_Name_Size
Goto:eof
)

POPD
goto :eof





:Same__Name_Size

REM Si el archivo es menor a 500 KB, lo eliminamos de la ruta.

If %Bytes% LSS 512000 (
Del /Q /F "%ruta%\%archivo%"
Echo %archivo%  -= %Bytes% bytes =- >>"%temp%\BORRADOS.txt"
Goto:eof
) ELSE (
Call :Mayor
goto:eof
)





REM Si el archivo es mayor a 500 KB pero menor a 1024 KB, NO lo eliminamos y lo añadimos a la lista.

:Mayor

If %Bytes% LSS 1048576 (
Echo %archivo%  -= %Bytes% bytes =- >>"%temp%\NO BORRADOS.txt"
Goto:eof
) ELSE (
goto:eof
)





:Not_same_Name_Size

REM Si el archivo es menor a 1024 KB, lo añadimos a la lista.

If %Bytes% LSS 1048576 (
Echo %archivo%  -= %Bytes% bytes =- >>"%temp%\NO BORRADOS.txt"
Goto:eof
) ELSE (
goto:eof
)





REM Mostramos el resultado de la operación y borramos los archivos temporales.

:Fin
Echo Operaci¢n finalizada.
Echo.
echo.Pulse una tecla para mostrar el resultado...
pause >nul
cls

Type "%temp%\Borrados.txt" | MORE
echo+ & echo+ & echo+ & echo+
Type "%temp%\NO Borrados.txt" | MORE

Del /Q "%temp%\Borrados.txt";"%temp%\NO Borrados.txt"
echo+ & echo+ & echo+ & echo.Pulse una tecla para salir...
Pause >nul
Exit



No he vuelto, solo estoy de paso.

leogtz

#2
Aquí está mi solución, recién salida del horno, lo bonito del código es la función "dirname"
que obtiene el directorio en el cual se encuentra un archivo, la función utiliza recursividad y
expresión regular.

Miren:

CitarC:\Users\leo>dirname c:\Users\leo\HijackThis.exe
[leo\]

C:\Users\leo>dirname "c:\Users\leo\Configuración local"
[leo\]

C:\Users\leo>dirname "c:\Users\leo\Desktop\BeJeweled 2 .lnk"
[Desktop\]

Obtiene el directorio en el cuál está el archivo. Esta función fue necesaria para la comparación entre el nombre de archivo y el directorio en el cual se encuentra el archivo.

Con esto he probado el código:

CitarC:\Users\leo>cd test

C:\Users\leo\test>tree /f
Listado de rutas de carpetas para el volumen Descargas
El número de serie del volumen es 00000200 466D:2456
C:.
¦   lala.html
¦   log.txt
¦   test.cpp
¦   test.exe
¦   test1.txt
¦
+---algo
¦       .bash_history
¦       10-easy-vim.pdf.zip
¦
+---test1
   ¦   test1.txt
   ¦
   +---algo
           .bash_history
           10-easy-vim.pdf.zip
           algo.bash_history
           algo.zip


C:\Users\leo\test>
test.cpp y test.exe tienen 370 KB y están en el directorio test, por lo cual deben de eliminarse.
En el directorio test1, test1.txt debe ser eliminado porque tiene 6KB y se llama igual que su directorio.
En el directorio algo, algo.bash_history debe ser eliminado porque tiene 170KB y está en el directorio algo.

El script genera un log en el directorio test con la siguiente información:

CitarNo borrar ... lala.html, directorio : C:\Users\leo\test, size : 540KB
Borrar archivo ... test.cpp, directorio : C:\Users\leo\test, size : 370KB
Borrar archivo ... test.exe, directorio : C:\Users\leo\test, size : 370KB
No borrar ... test1.txt, directorio : C:\Users\leo\test, size : 1KB
No borrar ... .bash_history, directorio : C:\Users\leo\test\algo, size : 170KB
Borrar archivo ... test1.txt, directorio : C:\Users\leo\test\test1, size : 6KB
No borrar ... .bash_history, directorio : C:\Users\leo\test\test1\algo, size : 170KB
Borrar archivo ... algo.bash_history, directorio : C:\Users\leo\test\test1\algo, size : 170KB

@echo off
setlocal enabledelayedexpansion
cd ./test
set dir=%CD%
rem Analizar el directorio actual:
for /f "tokens=*" %%_ in ('dir /b /a-d *.exe') do (
set size=
call:size "%%_"
if !talla! lss 500 (
call:dirname %%~dp_
if "!shit!"=="%%~n_\" (
echo Borrar archivo ... %%_, directorio : !cd!, size : !talla!KB >> "%dir%\log.txt"
) else (
echo No borrar ... %%_, directorio : !cd!, size : !talla!KB >> "%dir%\log.txt"
)
) else (
echo No borrar ... %%_, directorio : !cd!, size : !talla!KB >> "%dir%\log.txt"
)
)
rem Analizar subdirectorios:
for /f "tokens=*" %%_ in ('dir /b /s /ad') do (
pushd "%%_"
for /f "tokens=*" %%f in ('dir /b /a-d *.exe') do (
set size=
call:size "%%f"
if !talla! lss 500 (
call:dirname %%~dpf
if "!shit!"=="%%~nf\" (
echo Borrar archivo ... %%f, directorio : %%_, size : !talla!KB >> "%dir%\log.txt"
) else (
echo No borrar ... %%f, directorio : %%_, size : !talla!KB >> "%dir%\log.txt"
)
)
)
popd
)

goto:eof
:size
set /a talla=%~z1 / 1024 + 1
goto:eof
:dirname
if "%~1"=="" goto:eof
for /f "tokens=1* delims=\" %%a in ("%~1") do (
set shit=%%b
echo %%b | findstr /R "\\.." > nul && call:dirname !shit!
)


Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

Cita de: Leo Gutiérrez. en 21 Julio 2011, 07:36 AM
Aquí está mi solución, recién salida del horno, lo bonito del código es la función "dirname"

set shit=%%b

Shit!! :silbar: Has dejado mi script por los suelos... >:( :xD

Muy bueno tu script, como era de esperar!, un saludo!
No he vuelto, solo estoy de paso.

leogtz

Jaja, perdón por el shit, siempre les pongo nombres malos a mis variables cuando programo rápido :s.

Y tranquilo, seguro que tu script también funciona.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Dany3j

Voy a probar los script a ver que tal... Voy a ponerme  estudiarlos Bastante, la verdad noc como hacen ustedes siempre salen con cosas en los script que ni me hubiera imaginado, Ojala y llegue a saber como ustedes un dia de estos.  ;-)
"Pensando en Batch" XD

Dany3j

A otra cosa Estuve observando bien. Y la función funciona con imágenes Yo me refería que funcionara con archivos .exe Por ejemplo.

Archivos borrados test.exe porque es menor
Archivos no borrados  text1.exe  porque es menor de un 1 mega pero es .exe   :laugh:

"Pensando en Batch" XD

SuperDraco

Cita de: dany3j en 21 Julio 2011, 17:41 PM
A otra cosa Estuve observando bien. Y la función funciona con imágenes Yo me refería que funcionara con archivos .exe Por ejemplo.

:¬¬

En mi batch por ejemplo, para que solo funcione con archivos de extensión .exe cambais esto...


For /F "tokens=*" %%a in ('dir /B /A-D "%ruta%\*.exe"')
No he vuelto, solo estoy de paso.

leogtz

Los ajustes son mínimos para que los scripts funciones, recuerda que debes de dar todos los datos posibles...
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Dany3j

Ps si tienes razon Leo y Gracias a ambos... Con todo esto codigo tengo que logra algo jeje...  ;-)
"Pensando en Batch" XD