Alternativa #1: FOR /R é mais intuitiva do que #2 para mim.
Alternativa #2: FOR /F resolve o problema com “espaços nos nomes” na sugestão de BrianAdkins.
Alternativa #3: FORFILES seria a minha escolha, excepto que o caminho está entre aspas duplas.
Brian ou outros gurus podem ter uma solução mais elegante ou podem ser capazes de sugerir uma dúzia de outras soluções, mas estas três funcionam. Tentei usar FOR TOKENS mas depois tive de desnudar cabeçalhos e rodapés, por isso voltei a ser o número 1. Também considerei criar um pequeno ficheiro .bat e chamá-lo, mas isso acrescenta outro ficheiro (embora proporcione uma maior flexibilidade, como seria uma função).
Testei todas as alternativas com directório e nomes de ficheiros com espaços incorporados, um nome de ficheiro com mais de 200 caracteres, um nome de ficheiro sem extensão, e na raiz de uma pequena unidade (apenas pelo tempo; um pouco lento – tal como Brian sugeriu – mas depois também é pesquisar no Explorador do Windows; foi por isso que instalei a aplicação de pesquisa Everything search).
Alternativo #1: FOR /R
Best(?) Enquanto tentava descobrir porque é que a solução de Brian não funcionava para mim, olhei para HELP FOR e decidi tentar a abordagem /R. (Criar um ficheiro seria o mesmo que em Alternativa #2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Exemplo - Trabalhos (directório diferente do acima para demonstrar a recorrência)
@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
Alternativo #2: PARA /F
BrianAdkins’ sugerido: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
A resposta corrigida* é:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
A resposta mais completa com directórios suprimidos e a saída (anexada) a um ficheiro é:
@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
A
@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
Nota: “delims=*” especifica um carácter não permitido em nomes de ficheiros.
Nota: O 2º comando também suprime directórios via /a:-d.
Nota: Fez 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 ficheiro apenas para grins, uma vez que o OP pediu a saída para um ficheiro.
Suponho que devo realmente verificar o estado do ECHO e redefini-lo também.
Issue - Espaços em Nomes
A solução proposta por Brian não trata de nomes de ficheiros e pastas contendo espaços (pelo menos não na minha configuração Vista).
Exemplo - Errado(Sem delimitações; Inclui supressão de directório por OP mas com tamanho tanto antes como depois do nome do ficheiro para ênfase)
Truncado Nome e Tamanho (4 de 6 ficheiros incorrectos):
@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
Exemplo - Correcto(Nota de saída ao ecrã, não anexada ao ficheiro)
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Alternativo #3: FORFILES (Quote Issue)
Esta solução é directamente a partir dos dois últimos exemplos na documentação FORFILES (forfiles /?
).
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Combinando estes exemplos e escrevendo num ficheiro obtém-se a resposta (quase):
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
Note-se que o caminho está entre aspas na saída.
Não importa se echo on
ou echo off
é alternado.
A adição de uma linha em branco separando cada directório seria uma extensão trivial do FI.
Cautela : A utilização da máscara /m *.*
não devolverá ficheiros sem extensão (como o último ficheiro, por exemplo)!
Aside : Isto escreve um ficheiro em cada directório com o conteúdo apenas desse directório:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Não é o que o OP queria, mas por vezes é útil.
Exemplo - Trabalha (mas com o caminho completo entre aspas)
0x1&
Este exemplo inclui um directório extra com um nome de ficheiro super longo e um nome de ficheiro sem extensão.
Issue: Caminho entre aspas
Então, existe uma maneira fácil de remover as aspas indesejadas(?) por exemplo OP e salvar a Alternativa #3: FORFILES. (Pergunta retórica: As citações são uma característica ou uma falha?)