2016-02-02 1 views
0

У меня есть структура каталогов, подобная этой A-> B-> C, D-> E, F Где A содержит папку B и некоторые текстовые файлы, sql-файлы, файлы журналов и т. д. B содержит папку C и многие другие файлы расширений. Аналогично, E, F также являются подкаталогами и содержат некоторые файлы. Теперь выход должен быть чем-то вроде этого: Количество файлов: A-10 A/B-15 A/B/C-20 D-25 D/E-30 F-12 Спасибо за ваш ответ. Все подходы приветствуются.Общее количество файлов, папок и подпапок в текущем каталоге с использованием пакетного скрипта

Пытались:

@ECHO OFF 
SET "rootpath=%~1" 
FOR /D %%D IN ("%~dp0*") DO ( 
    SET cnt=0 
    FOR /F %%K IN ('DIR /A-D /S "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (SET /A cnt+=%%K) 
    SETLOCAL EnableDelayedExpansion 
    ECHO %%D: !cnt! 
    ENDLOCAL 
    pause 
) 
+1

Что вы получили до сих пор? Что вы пробовали? – MadsTheMan

+0

Я пробовал приведенный ниже код, но вытащил неправильные результаты и дал только непосредственные папки, но не количество файлов в подкаталогах. @ECHO OFF SET "rootpath =% ~ 1" FOR/D %% D IN ("% ~ dp0 \ *") DO ( SET cnt = 0 FOR/F %% K IN ('DIR/AD ( SET/A cnt + = %% K ) SETLOCAL EnableDelayedExpansion ECHO %% D: ! cnt! ENDLOCAL pause ) Спасибо за помощь! –

+0

Ваше название и название вопроса неясны; поэтому вы хотите получить подсчет _files_ (не dir.s) в (под) директории в полном дереве в текущем каталоге? В корне дерева есть файлы, которые нужно также подсчитать? это 'F'. на верхнем уровне или это суб-каталог. из 'E'? должен ли вывод показывать относительные пути к (под) каталогам? И в чем проблема с вашим кодом? – aschipfl

ответ

1

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

EDIT: Код изменен, чтобы избежать ошибок, когда имена подпапок имеют пробелы.

@echo off 
setlocal EnableDelayedExpansion 

set "base=%cd%\" 

rem Accumulate files in the same array element given by its folder 
for /R %%a in (*.*) do (
    set "folder=%%~DPa" 
    set "folder=!folder:%base%=!" 
    set /A "count[!folder: =_!]+=1" 2> nul 
) 

rem Show the result 
for /F "tokens=2,3 delims=[]=" %%a in ('set count[') do (
    echo %%a-%%b 
) 

Для дальнейшего описания управления массивами в пакетных файлах см: Arrays, linked lists and other data structures in cmd.exe (batch) script

+0

Не могли бы вы рассказать мне, как вывести путь и нет файлов: A-10 A/B-20 что-то вроде этого..пожалуйста, не плохо себя чувствую, я плохо разбираюсь в пакетном скрипте. Спасибо за ваш быстрый ответ –

+0

См. Измененный код ... – Aacini

+0

Пока я запускаю эту летучую мышь, я мог бы увидеть ошибку «отсутствующий операнд», это вызовет проблему. Help –