Как перечислить всю папку с размером с помощью пакетного файла

Я хочу простое решение для списка папок и их размера в формате txt или csv.

Я использую этот код для списка папок

dir C:\Temp\*.* /b /a:d > C:\folderList.txt

текущий выход

<<folderList.txt>>
folder1
folder2
folder3

желаемый выход

<<folderList.txt>>
folder1 # 100 MB
folder2 # 30 MB
folder3 # 110 MB

Просто он будет генерировать размер каждой папки. Как я могу продолжить? любая помощь

Ответ 1

Для каждой папки в списке используйте команду dir для получения размера файлов под папкой

@echo off
    setlocal disabledelayedexpansion

    set "folder=%~1"
    if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") 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
        echo(%%~nxa # !size!
        endlocal
    )

    endlocal

Он выполняет итерацию по указанной папке (передается как параметр в командный файл или текущий каталог, если нет параметра).

Для каждой папки внутри него (for /d) внутри внутренней команды for выполняется рекурсивная команда dir, и из ее вывода сводная строка в конце (извлеченная findstr) анализируется ( команда tokens в for) и извлекается общий размер всех файлов в этой подпапке. Тогда имя (и расширение, если оно есть) в папке и размер элементов под ней, эхо передается на консоль.

Если файл необходимо создать, перенаправьте вывод пакета в файл

getSizes.cmd "c:\temp" > C:\folderList.txt

Ответ 2

Используя отличный код MC ND, я добавил преобразование в Kb, Mb, Gb и т.д. На всякий случай вы предпочтете его использовать в этих форматах.

@echo off
setlocal disabledelayedexpansion

set "folder=%~1"
  if not defined folder set "folder=%cd%"

    for /d %%a in ("%folder%\*") 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
    )

endlocal
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
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),1)
for /f "delims=" %%a in ( 
  'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a
del %temp%\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

Ответ 3

если вы используете Windows 7 или новую команду powershell и введите команду

ls-r → log.txt

он перечислит все файлы в текущем каталоге вместе с размером файла в байтах для файла журнала.

Ответ 4

попробуйте для Windows:

dir /-c /a /w /s|sed -nr "/:$/q;/:/h;/^\s+[0-9]/{s/.*[^0-9]([0-9]+.*)/\1/;H;g;s/\n/ /p}"

Ответ 5

My Утилита JREN.BAT может использоваться для получения списка папок с размерами. Это гибридный JScript/пакет script, который запускается изначально на любом компьютере Windows с XP и далее.

JREN не удобно конвертировать в MB (или любой другой блок) - он просто перечисляет размер в байтах. Но это удобно (и сравнительно быстро), чтобы получить листинг:

jren "$" "' # '+size()" /d /j /list /p "d:\temp" >"C:\folderList.txt"

Возможно, вы сначала захотите сначала установить размер папки, а пробел будет заполнен до фиксированной ширины, превышающей самую большую папку, за которой следует имя папки. Я считаю, что этот формат намного легче читать, и его все же легко разобрать:

jren "^" "size('               ')+'  '" /d /j /list /p "d:\temp" >"C:\folderList.txt"

Результат выглядит примерно так:

           1852  SomeFolderName
        1616869  Another folder name
         137764  yetAnother

Так как JREN - командный файл, вы должны использовать CALL JREN, если вы поместите команду в другую партию script.

Ответ 6

Как мы можем получить размер на диске в папке с помощью командной строки?

С уважением, Alex