Alternativa nº 1: FOR / R é mais intuitivo que o nº 2 para mim.
Alternativa 2: FOR / F corrige o problema com "espaços em nomes" na sugestão de 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 sugerir uma dúzia de outras soluções, mas essas três funcionam. Tentei usar o FOR TOKENS, mas tive que retirar cabeçalhos e rodapés, então voltei para o # 1. Também considerei criar um pequeno arquivo .bat e chamá-lo, mas isso adiciona outro arquivo (embora ele forneça maior flexibilidade, como seria uma função).
Testei todas as alternativas com nomes de diretório e arquivos com espaços incorporados, um nome de arquivo com mais de 200 caracteres, um nome de arquivo sem extensão e na raiz de uma pequena unidade (apenas por tempo; um pouco lenta - como Brian sugeriu - mas então está pesquisando no Windows Explorer; foi por isso que instalei o aplicativo de pesquisa Tudo).
Alternativa 1: FOR / R
Melhor (?) Enquanto tentava descobrir por que a solução de Brian não funcionou para mim, olhei para HELP FOR e decidi tentar a abordagem / R. (Criar um arquivo seria o mesmo que na alternativa nº 2).
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Exemplo - Trabalhos (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 Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.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 os diretórios suprimidos e a saída (anexada) em 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 nos nomes de arquivos.
Nota: O segundo comando também suprime os diretórios via / a: -d.
Nota: Coloque o nome da variável FOR em maiúsculas para esclarecer a distinção entre parâmetros de variável e variável se alguém escolher nomes de variáveis diferentes.
Nota: Anexado ao arquivo apenas para sorrisos, pois o OP solicitava saída para um arquivo.
Suponho que realmente devo verificar o status do ECHO e redefini-lo também.
Edição - Espaços em Nomes
A solução proposta por Brian não lida com nomes de arquivos e pastas que contenham espaços (pelo menos não na minha configuração do Vista).
Exemplo - Errado
(sem delimitações; inclui suprimir o 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\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Exemplo - Correto
(Anote a saída na 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 Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Alternativa nº 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"
A combinação desses exemplos e a gravação 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 é alternado echo on
ou não echo off
.
Adicionar uma linha em branco que separa cada diretório seria uma extensão trivial do FI.
Cuidado : O uso da máscara/m *.*
não retornará arquivos sem extensão (como o último arquivo no exemplo)!
Além : Escreve 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 útil.
Exemplo - Funciona (mas com 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 Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.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 entre aspas
Portanto, existe uma maneira fácil de remover as aspas indesejadas (?) Pelo exemplo do OP e salvar a Alternativa nº 3: FORFILES. (Pergunta retórica: as aspas são um recurso ou uma falha?)
"tokens=*"
seguinte@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za