Alternatywa # 1: FOR / R jest dla mnie bardziej intuicyjna niż # 2.
Alternatywa # 2: FOR / F rozwiązuje problem z „spacjami w nazwach” w sugestii BrianaAdkinsa.
Alternatywa # 3: FORFILES będzie moim wyborem, z wyjątkiem tego, że ścieżka jest w podwójnych cudzysłowach.
Brian lub inni guru mogą mieć bardziej eleganckie rozwiązanie lub mogą zaproponować tuzin innych rozwiązań, ale te trzy działają. Próbowałem użyć FOR TOKENS, ale potem musiałem usunąć nagłówki i stopki, więc wróciłem z powrotem do # 1. Zastanawiałem się również nad utworzeniem małego pliku .bat i wywołaniem go, ale to dodaje kolejny plik (chociaż zapewnia większą elastyczność, tak jak funkcja).
Przetestowałem wszystkie alternatywy z nazwami katalogów i plików z osadzonymi spacjami, ponad 200-znakową nazwą pliku, nazwą pliku bez rozszerzenia i na katalogu głównym małego dysku (tylko na czas; trochę wolno - jak sugerował Brian - ale potem tak szuka w Eksploratorze Windows; dlatego zainstalowałem aplikację Wszystko do wyszukiwania).
Alternatywa nr 1: FOR / R
Najlepszy (?) Próbując dowiedzieć się, dlaczego rozwiązanie Briana nie zadziałało, spojrzałem na HELP FOR i postanowiłem wypróbować podejście / R. (Utworzenie pliku byłoby takie samo jak w wariancie nr 2).
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Przykład - działa (inny katalog niż powyżej, aby zademonstrować rekurencję)
@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
Alternatywa # 2: FOR / F
Sugerowane przez Briana Adkinsa: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Skorygowana odpowiedź brzmi:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Pełniejsza odpowiedź z katalogów tłumione i wyjścia (załączony) do pliku jest:
@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
Uwaga: „delims = *” określa znak niedozwolony w nazwach plików.
Uwaga: Drugie polecenie tłumi także katalogi za pomocą / a: -d.
Uwaga: Wprowadzono wielkie litery nazwy zmiennej FOR, aby wyjaśnić różnicę między zmiennymi a parametrami zmiennych, jeśli ktoś wybierze różne nazwy zmiennych.
Uwaga: Dołączany do pliku tylko z uśmiechem, gdy OP poprosił o wyjście do pliku.
Przypuszczam, że powinienem naprawdę sprawdzić status ECHO i zresetować go.
Problem - spacje w nazwach
Proponowane rozwiązanie Briana nie obsługuje nazw plików i folderów zawierających spacje (przynajmniej nie w mojej konfiguracji Visty).
Przykład - źle
(bez ograniczeń; Obejmuje blokowanie katalogu na OP, ale z rozmiarem zarówno przed jak i po nazwie pliku dla podkreślenia)
Skrócona nazwa i rozmiar (niepoprawne 4 z 6 plików):
@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
Przykład - Prawidłowo
(uwaga wyprowadzana na ekran, nie dołączana do pliku)
@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
Alternatywa # 3: FORFILES (problem z wyceną )
To rozwiązanie pochodzi bezpośrednio z dwóch ostatnich przykładów w dokumentacji FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Połączenie tych przykładów i zapisanie do pliku daje odpowiedź (prawie):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Zauważ, że ścieżka jest w cudzysłowie na wyjściu.
Nie ma znaczenia, czy echo on
czy echo off
jest przełączana.
Dodanie pustej linii oddzielającej każdy katalog byłoby trywialnym rozszerzeniem IF.
Uwaga : użycie maski/m *.*
nie zwróci plików bez rozszerzenia (jak na przykład ostatni plik)!
Poza tym : zapisuje plik w każdym katalogu z zawartością tylko tego katalogu:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Nie to, czego chciał OP, ale czasem przydatny.
Przykład - działa (ale z pełną ścieżką w cudzysłowie)
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
Ten przykład zawiera dodatkowy katalog z bardzo długą nazwą pliku i nazwą pliku bez rozszerzenia.
Problem: ścieżka w cytatach
Czy istnieje prosty sposób na usunięcie niechcianych (?) Cytatów z przykładu OP i zapisanie Alternatywy # 3: FORFILES. (Pytanie retoryczne: czy cytaty są cechą czy wadą?)
"tokens=*"
następująco@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za