С тем же подходом
@echo off
setlocal enableextensions disabledelayedexpansion
for /d %%a in (*) do for /f "tokens=1,5" %%b in ('
dir /a-d "%%~fa\*" 2^> nul ^| findstr /b /c:" " ^|^| echo 0
') do if "%%c"=="" echo %%~fa : %%b
Это будет
- Для каждой папки (
for /d
) возьмите ссылку и сохраните ее в %%a
заменяемый параметр
- Запустите команду
dir
указав полный путь к папке %%~fa
- Используйте трубу (
|
) для фильтрации списка, чтобы получить только строки, начинающиеся с двух пробелов (строки нижнего колонтитула)
- Если строки не найдены (то есть команда
dir
не выполнена), выведите 0
- Линии, сгенерированные
dir | findstr
обрабатывается командой for /f
. Мы прочтем первый токен (количество файлов в просчитанной строке) и пятый (только в строке нижнего колонтитула с информацией о каталогах)
- Если пятый элемент пуст, в этой строке есть информация о файлах, а не о папках, поэтому выведите путь к папке и файлам внутри нее.
Проблема с этим подходом состоит в том, что dir | findstr
выполняется для каждой из подпапок. Для более быстрого решения
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
Это просто вызовет robocopy
, но вместо того, чтобы что-то копировать, мы будем просить, чтобы ничего не копировалось, и возвращать только список того, что должно быть обработано (/nocopy /l
). Мы просим скопировать из текущей папки в текущую папку, включая идентичные файлы в процессе (/is
), обрабатывая пустую подпапку (/e
, чтобы включить папки с 0 файлами), но обрабатывать только два уровня (/lev:2
the текущая папка и папка ниже), без создания списка файлов (/nfl
), без заголовка задания (/njh
) и без сводки задания (/njs
)
Результатом будет тот же список, но с именем папки и количеством файлов в измененных столбцах.
Сохранить исходный формат вывода
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=1,*" %%a in ('
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
') do echo %%~fb : %%a
Это будет использовать for /f
для обработки предыдущей команды robocopy
, разделив строку на два токена, первый будет содержать количество файлов и будет сохранен в %%a
, а второй - оставшуюся часть строки и будет сохранен в %%b
. Для каждой строки в выходных данных внутренней команды robocopy
выполняется код в предложении do
: просто введите echo, чтобы отобразить два токена в обратном порядке.