Альтернатива #1: FOR /R более интуитивно понятна, чем #2 для меня. 0x2 & Альтернатива #2: FOR /F исправляет проблему с “пробелами в именах” в предложении Брайана Адкинса.
Альтернатива #3: FORFILES был бы моим выбором за исключением того, что путь находится в двойных кавычках.
Брайан или другие гуру могут иметь более элегантное решение или могут предложить дюжину других решений, но эти три работают. Я попробовал использовать FOR TOKENS, но потом пришлось убрать заголовки и колонтитулы, так что я вернулся к #1. Я также подумал о создании небольшого .bat-файла и его вызове, но это добавило еще один файл (хотя это и обеспечивает большую гибкость, как и функция).
я протестировал все альтернативы с каталогами и именами файлов со встроенными пробелами, 200+ символьным именем файла, именем файла без расширения и в корне небольшого диска (только на время; немного медленно - как и предлагал Брайан - но потом и поиск в Проводнике Windows; поэтому я установил приложение поиска Everything search).
Alternative #1: FOR /R
Best(?) Пытаясь выяснить, почему решение Брайана не сработало для меня, я посмотрел на HELP FOR и решил попробовать подход /R. (Создание файла было бы тем же самым, что и в Alternative #2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Example - Works (другой каталог, чем выше, чтобы продемонстрировать рекурсию)
@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
Альтернатива #2: FOR /F
Предложение Брайана Адкинса: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
A исправленный ответ:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
A более полный ответ с подавленными каталогами и выводом (прилагается) в файл:
@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 и сбросить его.
Issue - Пробелы в именах
Предлагаемое Брайаном решение не обрабатывает имена файлов и папок, содержащие пробелы (по крайней мере, в моей конфигурации Vista).
Example - Wrong(Без разделителей; Включает подавление директории на 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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Example - Исправлено(Вывод заметки на экран, не приложен к файлу)
@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
Альтернатива #3: FORFILES (Quote Issue)
Это решение взято прямо из двух последних примеров в документации 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 *.*
не вернет файлы без расширения (как последний файл в примере)!
Aside : При этом в каждую директорию записывается файл с содержимым только этой директории:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Не то, что хотел ОП, но иногда удобно.
Example - Works (но с полным ходом в кавычках)
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
Этот пример включает в себя дополнительный каталог с супер длинным именем файла и именем файла без расширения.
Issue: Путь в Quotes
Итак, есть ли простой способ удалить ненужные(?) кавычки в примере OP и сохранить Альтернативу #3: FORFILES. (Риторический вопрос: Являются ли кавычки особенностью или недостатком?).