Batch para listar archivos de una unidad

Iniciado por lmgmonzon, 12 Marzo 2013, 10:06 AM

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

lmgmonzon

Buenos días, estoy un poco pez en programción y necesitaría un script que me permitiera crear un listado de todos los archivos de una unidad donde apareciera la ruta completa, la fecha de creación y el tamaño del archivo, y pudiera ordenarlos según estos tres criterios.

Muchas gracias por todo,
Un saludo.

Almapa

Simplemente con el comando DIR ya puedes solucionarlo, pues tiene la opción /O para ordenar según el criterio que quieras y la opción /S te permitirá recorrer todos los subdirectorios desde el punto de donde se ejecute.

Para más ayuda teclea en la consola:  dir /?

Eleкtro

#2
(Quiero, quiero, y lo quiero todo hecho...)

Hacer eso en Batch es una locura, más que nada si se trata de un Disco duro y estuviese más o menos LLENO, por el consumo de tiempo que tardarían dichas operaciones (Listar + ordenar), no puedes ordenar natívamente por fecha de creación (Sólo de modificación), ni tampoco puedes ordenar números por el método burbuja, así que hay que hacer malabares para ordenar fechas y tamaños, esto es Batch, un "lenguaje" limitado, hay que usarlo por otros medios que consumen más tiempo.

Diréctamente yo te iría recomendando que lo hicieras en cualquier otro lenguaje, pero bueno, aquí tienes para empezar en Batch:

Método básico:
Código (dos) [Seleccionar]
@Echo OFF

:: By Elektro H@cker

Echo Sort files by...       | MORE
Echo [1] Full path
Echo [2] Modified date
Echo [3] FileSize     | MORE

Choice /C 123

IF "%ERRORLEVEL%" EQU "1" (DIR /B /S /A-D /ON "*")
IF "%ERRORLEVEL%" EQU "2" (DIR /B /S /A-D /OD "*")
IF "%ERRORLEVEL%" EQU "3" (DIR /B /S /A-D /OS "*")

Pause&Exit


Método avanzado:

@Echo OFF
SetLocal EnableDelayedExpansion

MODE CON COLS=999 LINES=999

:: By Elektro H@cker

Echo Sort files by... | MORE
Echo [1] Path
Echo [2] Date
Echo [3] FileSize     | MORE

Choice /C 123

Set "Sorting=%ERRORLEVEL%"

Echo [+] Listing files... | MORE
DIR /B /S /A-D "*" > "%TEMP%\FileList_Unsorted.tmp"

Echo [+] Sorting files... | MORE

:: Path
IF "%Sorting%" EQU "1" (
(For /F "Tokens=* usebackq" %%# in ("%TEMP%\FileList_Unsorted.tmp") Do (Echo %%#))>"%TEMP%\FileList_Sorted.tmp"
)

:: Date
IF "%Sorting%" EQU "2" (
(For /F "Tokens=* usebackq" %%# in ("%TEMP%\FileList_Unsorted.tmp") Do (
   SET "Date=%%~t#"
   SET "Date=!DATE:~6,4!-!DATE:~3,2!-!DATE:~0,2!"
   Echo !DATE! ^| %%#
   ))>"%TEMP%\FileList_Sorted.tmp"
)

:: Size
IF "%Sorting%" EQU "3" (
Set /A "Bubble_MAX=0"

(For /F "Tokens=* usebackq" %%# in ("%TEMP%\FileList_Unsorted.tmp") Do (
Echo %%~z# ^| %%#
ECHO %%~z# >"%TEMP%\FileSize.tmp"
FOR %%X IN ("%TEMP%\FileSize.tmp") DO (SET /A "Number_Length=%%~zX-3")
If !Number_Length! GTR !Bubble_MAX!   (Set /A "Bubble_MAX=!Number_Length!")
)))>"%TEMP%\FileList_Sorted.tmp"

   :: Zero fill
(FOR /F "Tokens=1,* usebackq Delims= " %%X in ("%TEMP%\FileList_Sorted.tmp") DO (
   Echo %%X >"%TEMP%\FileSize.tmp"
   FOR %%X IN ("%TEMP%\FileSize.tmp") DO (SET /A "Number_Length=%%~zX-3")
       IF NOT !Number_Length! EQU !Bubble_MAX! (
       Set /A "Zero_Count=!bubble_Max!-!Number_Length!"
       For /L %%@ in (1,1,!Zero_Count!) do (SET "Zero_Fill=0!Zero_Fill!")
       SET "Number_Filled=!Zero_Fill!%%X"
       Echo !Number_Filled! %%Y
       SET "Zero_Fill="
       ) ELSE (Echo %%X %%Y)
   ))>"%TEMP%\FileList_Bubble_Sorted.tmp"
)

ENDLOCAL

:Show_List
Echo [+] Showing files... | MORE
(Type "%TEMP%\FileList_Bubble_Sorted.tmp" || Type "%TEMP%\FileList_Sorted.tmp") | SORT
Pause&Exit


Imagen de este último script:




Saludos








lmgmonzon

Muchas gracias por la ayuda.

Un saludo.