it-swarm.com.ru

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

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

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

10
goldenbutter

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

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

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

Используя превосходный код 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
11
Matt Williamson

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

ls-r >> log.txt

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

1
Ketan Verma

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

1
dbenham

попробуйте 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}"
0
Endoro

Я взял код @Matt Williamsons и сделал так, чтобы он экспортировал каждую строку в файл .csv в каталоге run, 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
0
Leland