Alternativa # 1: FOR / R é mais intuitivo que o # 2 para mim.
Alternativa # 2: FOR / F corrige o problema com "espaços em nomes" na sugestão do BrianAdkins.
Alternativa # 3: FORFILES seria minha escolha, exceto que o caminho está entre aspas duplas.
Brian ou outros gurus podem ter uma solução mais elegante ou podem sugerir uma dúzia de outras soluções, mas essas três funcionam. Eu tentei usar FOR TOKENS, mas depois tive que remover cabeçalhos e rodapés, então voltei ao # 1. Eu também considerei criar um pequeno arquivo .bat e chamá-lo, mas isso adiciona outro arquivo (embora ele forneça maior flexibilidade, assim como uma função).
Eu testei todas as alternativas com diretórios e nomes de arquivos com espaços embutidos, um nome de arquivo de 200+ caracteres, um nome de arquivo sem extensão e na raiz de uma pequena unidade (apenas por tempo; um pouco lento - como Brian sugeriu - mas então está pesquisando no Windows Explorer, é por isso que eu instalei o aplicativo Everything search).
Alternativa # 1: FOR / R
Melhor (?) Ao tentar descobrir por que a solução de Brian não funcionou para mim, olhei para o HELP FOR e decidi tentar a abordagem de / R. (Criando um arquivo seria o mesmo que na alternativa # 2.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Exemplo - Works (diretório diferente do que acima para demonstrar recursão)
@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternativa # 2: FOR / F
BrianAdkins sugeriu: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Uma resposta corrigida é:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Uma resposta mais completa com diretórios suprimidos e saída (anexada) a um arquivo é:
@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt
Nota: "delims = *" especifica um caractere não permitido em nomes de arquivos.
Nota: o segundo comando também suprime diretórios via / a: -d.
Nota: Feito o nome da variável FOR maiúscula para clarificar a distinção entre variáveis e parâmetros variáveis se alguém escolher diferentes nomes de variáveis.
Nota: Anexado ao arquivo apenas para sorrisos como o OP pediu a saída para um arquivo.
Suponho que eu realmente deveria verificar o status do ECHO e redefini-lo também.
Problema - espaços em nomes
A solução proposta por Brian não lida com nomes de arquivos e pastas contendo espaços (pelo menos não na minha configuração do Vista).
Exemplo - Errado
(Sem delims; inclui a supressão do diretório por OP, mas com tamanho antes e depois do nome do arquivo para ênfase)
Nome e tamanho truncados (4 de 6 arquivos incorretos):
@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder
C:\DeleteLater\Folder
C:\DeleteLater\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Exemplo - Correto
(Observe a saída para a tela, não anexada ao arquivo)
@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternativa # 3: FORFILES (edição de cotação)
Esta solução é diretamente dos dois últimos exemplos na documentação do FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Combinar esses exemplos e gravar em um arquivo produz a resposta (quase):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Observe que o caminho está entre aspas na saída.
Não importa se echo on
ou echo off
é alternado.
Adicionar uma linha em branco separando cada diretório seria uma extensão trivial do IF.
Cuidado : Usar a máscara /m *.*
não retornará arquivos sem extensão (como o último arquivo no exemplo)!
> Aside : Isso grava um arquivo em cada diretório com o conteúdo desse diretório:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Não é o que o OP queria, mas às vezes é prático.
Exemplo - Funciona (mas com o caminho completo entre aspas)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"
"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spacesnd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0
Este exemplo inclui um diretório extra com um nome de arquivo super longo e um nome de arquivo sem extensão.
Problema: caminho nas cotações
Portanto, existe uma maneira fácil de remover as cotações indesejadas (?) pelo exemplo do OP e salvar a Alternativa # 3: FORFILES. (Pergunta retórica: as citações são uma característica ou uma falha?)