Альтернатива № 1: FOR /R является более интуитивным, чем № 2 для меня.
Альтернатива № 2: FOR /F исправляет проблему с "пробелами в именах" в предложении Брайана Адкинса.
Альтернатива № 3: FORFILES будет моим выбором, за исключением того, что путь в двойных кавычках.
У Брайана или других гуру может быть более изящное решение, или он может предложить дюжину других решений, но эти три работают. Я попытался использовать FOR TOKENS, но затем мне пришлось убрать верхние и нижние колонтитулы, поэтому я вернулся к # 1. Я также подумал о создании небольшого файла .bat и его вызове, но это добавляет еще один файл (хотя он обеспечивает большую гибкость, как и функция).
Я проверил все альтернативы с каталогом и именами файлов со встроенными пробелами, 200+ символьными именами файлов, именами файлов без расширений и на корне небольшого диска (только на время; немного медленный - как предложил Брайан - но потом выполняет поиск в проводнике Windows, поэтому я установил приложение «Все для поиска»).
Альтернатива № 1: FOR /R
Лучший(?) Пытаясь выяснить, почему решение Брайана не сработало для меня, я посмотрел на HELP FOR и решил попробовать подход /R. (Создание файла будет таким же, как в Альтернативе № 2.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Пример - Работает (другой каталог, чем выше, чтобы продемонстрировать рекурсию)
@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
Альтернатива № 2: FOR /F
BrianAdkins 'предложил: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Исправленный ответ :
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Более полный ответ с подавлением каталогов и выводом (добавлением) в файл:
@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
Примечание: «delims = *» указывает символ, не разрешенный в именах файлов.
Примечание: 2-я команда также подавляет каталоги с помощью /a: -d.
Примечание: Сделал заглавную букву имени переменной FOR, чтобы прояснить различие между переменной и параметрами переменной, если кто-то выбирает разные имена переменных.
Примечание: добавляется в файл только для ухмылок, так как ОП запрашивает вывод в файл.
Я полагаю, что мне действительно нужно проверить состояние ECHO и сбросить его.
Проблема - пробелы в именах
Предлагаемое Брайаном решение не обрабатывает имена файлов и папок, содержащие пробелы (по крайней мере, в моей конфигурации Vista).
Пример - Неверно (без разделителей; Включает подавление каталога для OP, но с размером до и после имени файла для выделения)
Сокращенное имя и размер (неверно 4 из 6 файлов):
@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
Пример - Правильно (Примечание выводится на экран, не добавляется в файл)
@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
Альтернатива № 3: FORFILES (выпуск цитат )
Это решение прямо из последних двух примеров в документации FORFILES (forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Объединение этих примеров и запись в файл дает ответ (почти):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Обратите внимание, что путь указан в кавычках в выходных данных.
Не имеет значения, echo on
или echo off
.
Добавление пустой строки, разделяющей каждый каталог, было бы тривиальным расширением IF.
Внимание: использование маски /m *.*
Не вернет файлы без расширения (как последний файл в примере)!
В сторону: в каждом каталоге записывается файл с содержимым только этого каталога:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Не то, что хотел ОП, но иногда удобно.
Пример - работает (но с полным путём в кавычках)
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
Этот пример включает в себя дополнительный каталог с очень длинным именем файла и именем файла без расширения.
Проблема: путь в кавычках
Итак, есть ли простой способ удалить нежелательные (?) кавычки в примере с OP и сохраните Альтернативу № 3: ФОРМЫ. (Риторический вопрос: цитаты - это особенность или недостаток?)