Com a mesma abordagem
@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
Isso vai
- Para cada pasta (
for /d
), pegue uma referência e armazene-a no parâmetro%%a
replaceable - Execute um comando
dir
com o caminho completo da pasta%%~fa
- Use um canal (
|
) para filtrar a lista para recuperar apenas as linhas que começam com dois espaços (as linhas de rodapé) - Se nenhuma linha for encontrada (ou seja, o comando
dir
falhou), imprima 0 - As linhas geradas pelo
dir | findstr
são manipuladas com um comandofor /f
. Vamos ler o primeiro token (o número de arquivos na linha adecuada) e o quinto (apenas presente na linha de rodapé com a informação dos diretórios) - Se o quinto elemento estiver vazio, essa linha terá informações sobre os arquivos, não sobre as pastas, assim ecoará o caminho da pasta e os arquivos dentro dele
O problema com essa abordagem é que dir | findstr
é executado para cada uma das subpastas. Para uma solução mais rápida
robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
Isso simplesmente chamará robocopy
, mas em vez de copiar qualquer coisa, solicitaremos que nada seja copiado e só retorne a lista do que deve ser processado ( /nocopy /l
). Solicitamos copiar da pasta atual para a pasta atual, incluindo arquivos idênticos no processo ( /is
), processando a subpasta vazia ( /e
, para incluir pastas com 0 arquivos), mas apenas processar dois níveis ( /lev:2
a pasta atual e a que está abaixo), sem gerar uma lista de arquivos ( /nfl
), nenhum cabeçalho de trabalho ( /njh
) e nenhum resumo de trabalho ( /njs
)
O resultado será a mesma lista, mas com o nome da pasta e o número de arquivos nas colunas alteradas
Para manter o formato de saída original
@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
Isso usará for /f
para processar o comando robocopy
anterior, dividindo a linha em dois tokens, o primeiro conterá o número de arquivos e será armazenado em %%a
, e o segundo, o restante do arquivo. linha e será armazenado em %%b
. Para cada linha na saída do comando robocopy
interno, o código na cláusula do
é executado: apenas echo para consolar os dois tokens na ordem inversa.