es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener la lista de carpetas/archivos + tamaño desde el archivo .BAT o Batch.

Tengo un código para obtener la lista y tamaño de todas las carpetas en una ruta dada. La condición es que si el tamaño del archivo es menor a 1 GB, se debe mostrar en MB, de lo contrario en GB (lo cual funciona perfectamente).

El único problema es que solo quiero obtener la lista de archivos y el tamaño. Pero solo me da la lista de carpetas. Si mi carpeta de entrada tiene 10 carpetas y 5 archivos, este código solo me dará la lista y tamaño de las 10 carpetas. Quiero todos los archivos y carpetas.

Adjunto mi código aquí. Alguien por favor revíselo y cambie si es necesario. También quiero que esta lista se ordene alfabéticamente. Si alguien puede darme un código de PowerShell con la misma funcionalidad, eso también estaría bien, porque este código es un poco largo.

@ echo off
setlocal disabledelayedexpansion

set “InputFolder=F:\Carpeta_Entrada”
set “OutputFolder=F:\Carpeta_Salida”
set “TempFolder=F:\Temp”
del “%OutputFolder%\WS_list.txt”
if not defined InputFolder set “InputFolder=%cd%”

for /d %%a in (“%InputFolder%*”) do (
set “size=0”
for /f “tokens=3,5” %%b in (‘dir /-c /a /w /s “%%~fa*” 2>nul | findstr /b /c:” “‘) do if “%%~c”==”” set “size=%%~b”
setlocal enabledelayedexpansion
call :GetUnit !size! unit
call :ConvertBytes !size! !unit! newsize
echo(%%~nxa – !newsize! !unit!
endlocal
) >> “%OutputFolder%\WS_list.txt”

endlocal
pause
exit /b

:ConvertBytes bytes unit ret
setlocal
if “%~2” EQU “KB” set val=/1024
if “%~2” EQU “MB” set val=/1024/1024
if “%~2” EQU “GB” set val=/1024/1024/1024
if “%~2” EQU “TB” set val=/1024/1024/1024/1024

“%TempFolder%\tmp.vbs” echo wsh.echo FormatNumber(eval(%~1%val%),1)
for /f “delims=” %%a in (
‘cscript //nologo “%TempFolder%\tmp.vbs”‘
) do endlocal & set %~3=%%a
del “%TempFolder%\tmp.vbs”
exit /b

:GetUnit bytes return
set byt=00000000000%1X
set TB=000000000001099511627776X
if %1 LEQ 1024 set “unit=Bytes”
if %1 GTR 1024 set “unit=KB”
if %1 GTR 1048576 set “unit=MB”
if %1 GTR 1073741824 set “unit=GB”
if %byt:~-14% GTR %TB:~-14% set “unit=TB”
endlocal & set %~2=%unit%
exit /b

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás tratando de obtener una lista de todas las carpetas y archivos en una ruta dada, junto con su tamaño, ordenados alfabéticamente. Has proporcionado un fragmento de código que te está dando la lista de carpetas y su tamaño, pero no de los archivos.

    Para obtener la lista de archivos y su tamaño, puedes modificar el fragmento de código de la siguiente manera:

    @echo off
    setlocal disabledelayedexpansion
    
    set "InputFolder=F:\Carpeta\Entrada"
    set "OutputFolder=F:\Carpeta\Salida"
    set "TempFolder=F:\Temp"
    del "%OutputFolder%\Lista_WS.txt"
      if not defined InputFolder set "InputFolder=%cd%"
    
    for /f %%a in ('dir /b /a-d "%InputFolder%\*"') do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%InputFolder%\%%~a" 2>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        call :GetUnit !size! unit
        call :ConvertBytes !size! !unit! newsize
        echo(%%~a - !newsize! !unit!
        endlocal
    ) 
    for /d %%a in ("%InputFolder%\*") do (
        set "size=0"
        for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
        setlocal enabledelayedexpansion
        call :GetUnit !size! unit
        call :ConvertBytes !size! !unit! newsize
        echo(%%~nxa - !newsize! !unit!
        endlocal
    ) >> "%OutputFolder%\Lista_WS.txt"
    
    endlocal
    pause
    exit /b
    
    :ConvertBytes bytes unit ret
    setlocal
    if "%~2" EQU "KB" set val=/1024
    if "%~2" EQU "MB" set val=/1024/1024
    if "%~2" EQU "GB" set val=/1024/1024/1024
    if "%~2" EQU "TB" set val=/1024/1024/1024/1024
    
    "%TempFolder%\tmp.vbs" echo wsh.echo FormatNumber(eval(%~1%val%),1)
      for /f "delims=" %%a in ( 
        'cscript //nologo "%TempFolder%\tmp.vbs"' 
      ) do endlocal & set %~3=%%a
      del "%TempFolder%\tmp.vbs"
      exit /b
    
    :GetUnit bytes return
    set byt=00000000000%1X
    set TB=000000000001099511627776X
    if %1 LEQ 1024 set "unit=Bytes"
    if %1 GTR 1024   set "unit=KB"
    if %1 GTR 1048576  set "unit=MB"
    if %1 GTR 1073741824  set "unit=GB"
    if %byt:~-14% GTR %TB:~-14% set "unit=TB"
    endlocal & set %~2=%unit%
    exit /b
    

    Para ordenar la lista alfabéticamente, puedes agregar el comando /O:N al comando dir. Por ejemplo:

    for /f %%a in ('dir /b /a-d /O:N "%InputFolder%\*"') do (
        ...
    ) 
    for /d %%a in ("%InputFolder%\*") do (
        ...
    ) >> "%OutputFolder%\Lista_WS.txt"
    

Comments are closed.