Альтернатива №1: FOR / R для мене інтуїтивніше, ніж №2.
Альтернатива №2: FOR / F виправляє проблему з "пробілами в іменах" у пропозиції BrianAdkins.
Альтернатива №3: FORFILES мій вибір, за винятком того, що шлях є в подвійних лапках.
Брайан або інші гуру можуть мати більш елегантне рішення або можуть запропонувати ще десяток інших рішень, але ці три роботи. Я спробував використовувати FOR TOKENS, але потім довелося знімати колонтитули, тому я повернувся до №1. Я також розглядав можливість створення невеликого .bat-файлу та виклику його, але це додає ще один файл (хоча він забезпечує більшу гнучкість, як і функція).
Я перевірив усі альтернативи з каталогом та назви файлів із вбудованими пробілами, ім'ям файлу 200+ символів, іменем файлу без розширення та на корені невеликого диска (просто на час; трохи повільно - як запропонував Брайан - але тоді так здійснює пошук у Провіднику Windows; саме тому я встановив додаток пошуку Everything).
Альтернатива №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).
Приклад - Неправильно
(Без розмежувань; Включає придушувальний каталог на ОП, але з розміром до і після назви файлу для наголосу)
Урізане ім’я та розмір (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 /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
Цей приклад включає додатковий каталог із надто довгим ім'ям файлу та ім'ям файлу без розширення.
Випуск: Шлях у котируваннях
Отже, чи є простий спосіб видалити небажані (?) Лапки за прикладом ОП та зберегти Альтернативу №3: ФОРФІЛИ. (Риторичне запитання: цитати є ознакою чи вадою?)
"tokens=*"
наступне@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za