Подсчет файлов и каталогов на каждом уровне каталогов из командного файла
Я успешно использовал командный файл, который подсчитывает общее количество файлов и каталогов в корневом каталоге.
Структура каталогов:
Вот текущий скрипт: (получает количество файлов и папок, возвращающих подпапки до n-го дочернего элемента).
@echo off
set "drive=D:\Download\app"
for /d %%r in ("%drive%\*") do (
echo Path: %%~fr
for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s %%~fr ^| find /i "bytes"') do if "%%j"=="File(s)" (
set numfiles=%%i
)ELSE (
for /f %%a in ('dir /b /s /ad %%~fr ^|find /c /v "" ') do set numfolders=%%a)
echo Files: %numfiles%
echo Folds: %numfolders%
)
Сначала программа выводит общее количество файлов и общее количество папок в корневом каталоге, а затем переходит в первую подпапку и выводит то же самое для всего дерева, затем перемещается в следующую папку на этом уровне и т. Д.
РЕДАКТИРОВАТЬ
Я выполнил ту часть, в которой он перешел на один уровень подпапок и получил общее количество файлов и папок, но я хочу, чтобы оно достигло N количества подпапок, что означает, что он должен выводить общее количество для каждой папки в корневом каталоге.
Вот расширенный код.
@echo off
setLocal EnableDelayedExpansion
set "drive=C:\Users\%USERNAME%\Downloads\Sandukchi"
set numfiles=
set numfolders=
set count=0;
for /d %%r in ("%drive%\*") do (
echo %%r
SET /A count=count + 1
for /d %%a in ("%%r\*") do set modifiedDate=%%~ta
for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "File(s)"') do set fileSizeBytes=%%k
for %%* in ("%%r") do set folderName=%%~nx*
for /F "tokens=1,2,3 delims= " %%i in ('dir/a/s "%%r\*" ^| find /i "bytes"') do if "%%j"=="File(s)" (
set numfiles=%%i
)ELSE (
for /f %%a in ('dir /b /s /ad "%%r\*" ^|find /c /v "" ') do set numfolders=%%a)
echo Last Modified Date: !modifiedDate!
echo Folder Size: !fileSizeBytes! KB
echo Total Number of Files: !numfiles!
echo Total Number of Folders: !numfolders!
(
echo !count! %%r !folderName! !modifiedDate! Total Size !fileSizeBytes!KB Total Files !numfiles! Total Folder !numfolders!
echo.
)>>output.txt
)
2 ответа
@ECHO Off
SETLOCAL
SET "sourcedir=."
SET "tempfile=%temp%\##__##.txt"
SET "dirname="
(
FOR /f "tokens=1,2,*delims= " %%w IN (
'dir /s "%sourcedir%\*" '
) DO (
IF "%%w"=="Directory" (
SET "dirname=%sp256%%%y"&SET /a fcnt=0&SET /a dcnt=-2
) ELSE (
FOR /f "delims= " %%p IN ("%%y") DO (
IF "%%p"=="<DIR>" SET /a dcnt+=1
)
)
IF "%%x"=="File(s)" CALL ECHO %%dirname%%*%%w*%%dcnt%%
)
)>"%tempfile%"
FOR /f "tokens=1,2,*delims=*" %%a IN ('sort "%tempfile%"') DO ECHO directory %%a&ECHO files %%b&echo subdirs %%c
GOTO :EOF
Вам нужно будет изменить настройку sourcedir
в соответствии с вашими обстоятельствами.
Создает временный файл. Не предпринимались попытки удалить временный файл, поскольку он может содержать полезные данные.
Запустить стандарт dir/s
команда, и выберите строки, которые начинаются directory
(который указывает новое имя каталога) и те, где третий токен разделен пробелом <DIR>
для подсчета подкаталогов. Когда строки со вторым токеном File(s)
Появится имя, filecount и directorycount для временного файла.
Сортируйте временный файл и сообщите.
Замечания: %%y
содержит третий токен от каждой строки. Это повторяется, выбирая только первый токен (по умолчанию) %%p
выделение третьего токена исходной строки.
Tempfile производится с использованием *
в качестве разделителя с *
не является допустимым символом имени файла.
dcnt
установлен в -2
чтобы начать подсчет каталогов, потому что оба .
а также ..
сообщаются как имена каталогов в dir /s
,
Попробуйте этот код:
@echo off
Setlocal EnableDelayedExpansion
@For /D %%D in (*) DO (
Set "Folder=%%~D"
PUSHD "!Folder!"
FOR /F %%H in ('dir /a-d /b 2^>NUL^|find /C /V "" ') DO ( Set "numFiles=%%H" )
FOR /F %%I in ('dir /ad /b 2^>NUL^|find /C /V "" ') DO ( Set "numSubFolders=%%I" )
POPD
echo The Folder "!Folder!" has !numSubFolders! SubFolders and !numFiles! Files
)
)
pause & exit