Как вывести список всех папок с размером через командный файл

Мне нужно простое решение для списка папок и их размера в формате 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

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


person goldenbutter    schedule 11.02.2014    source источник
comment
См. stackoverflow.com/questions/12813826/ -- нет хорошего способа узнать использование диска из командной строки Windows.   -  person mbroshi    schedule 11.02.2014


Ответы (6)


Для каждой папки в списке используйте команду 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) рекурсивная команда dir выполняется внутри внутренней команды for, и из ее вывода анализируется итоговая строка в конце (извлекаемая findstr) (команда tokens в for) и общий размер будут получены все файлы в этой подпапке. Затем имя (и расширение, если оно есть) папки и размер элементов под ней выводятся на консоль.

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

getSizes.cmd "c:\temp" > C:\folderList.txt
person MC ND    schedule 11.02.2014
comment
Как это будет работать? где выходной файл? а где путь к входной папке? пожалуйста уточните это.. - person goldenbutter; 12.02.2014
comment
@goldenbutter, добавлены заявления и примеры использования. - person MC ND; 12.02.2014
comment
спасибо @MC ND ... все работает, я добавил имя файла для добавления всего списка в нужное место ... Спасибо - person goldenbutter; 12.02.2014
comment
просто пытаюсь настроить вывод .... вместо BYETS вывод будет в виде КБ .... я пробовал "size=%%~b"/1024 или !size!/1024 ... но он печатает все .... :( - person goldenbutter; 12.02.2014
comment
@goldenbutter, set /a "size=%%~b/1024" НО, в пакетных файлах арифметика ограничена 32-битными целыми числами со знаком. Если у вас есть папка с данными более 2 ГБ, то вы не сможете сделать это таким образом. Если абсолютная точность не требуется, вы можете вывести !size:~0,-3!, или вам нужно будет добавить код для ее обработки. - person MC ND; 12.02.2014
comment
можно ли получить все файлы, включая все папки... в одном списке? @МС НД - person goldenbutter; 15.11.2020

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

@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
person Matt Williamson    schedule 12.02.2014
comment
Это потрясающе .... работает отлично .... спасибо за форматирование UNIT .... @Matt Willamson - person goldenbutter; 14.02.2014
comment
Это работает, однако это только список папок с верхнего уровня и не рекурсивно проходит через все папки... предложения? - person Drew; 10.11.2015
comment
Как вы будете обрабатывать большие по размеру каталоги, которые имеют более 32-битное целое число? Что-то вроде определенных ГБ и ТБ? - person Eli Borodach; 05.02.2018
comment
@Drew, похоже, рекурсия рекурсивна на уровне, на котором вы его размещаете / запускаете, вы имеете в виду, что хотите также видеть промежуточные результаты (например, размеры каждой подпапки, подпапки и т. Д.)? - person George Birbilis; 09.12.2019

Я взял код @Matt Williamsons и заставил его экспортировать каждую строку в файл .csv в каталоге запуска, folderSizes.csv. Он предоставляет полный размер байта в виде столбца, чтобы вы могли легко сортировать в Excel (или что-то еще).

@echo off
echo Getting folder sizes for you...storing to folderSizes.csv
setlocal disabledelayedexpansion
if EXIST folderSizes.csv del folderSizes.csv
echo Folder,Bytes Size,Short Size > folderSizes.csv

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,!size!,!newsize!!unit! >> folderSizes.csv
        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
person Leland    schedule 15.11.2016

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

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

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, если вы помещаете команду в другой пакетный сценарий.

person dbenham    schedule 06.03.2015

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

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

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

ls-r >> log.txt

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

person Ketan Verma    schedule 24.06.2016
comment
это не обеспечит вывод стиля folder1 # 100 МБ, он же рекурсивно перебирает подпапки и суммирует размеры файлов в них - person George Birbilis; 09.12.2019