Alternatywa #1: FOR /R jest dla mnie bardziej intuicyjna niż #2.
Alternatywa #2: FOR /F rozwiązuje problem ze “spacjami w nazwach” w sugestii BrianaAdkinsa.
Alternatywa #3: FORFILES byłaby 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ą być w stanie zasugerować 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 do #1. Rozważałem również stworzenie małego pliku .bat i wywołanie go, ale to dodaje kolejny plik (chociaż zapewnia większą elastyczność, podobnie jak funkcja).
Przetestowałem wszystkie alternatywy z nazwami katalogów i plików z osadzonymi spacjami, nazwami plików o długości 200+ znaków, nazwami plików bez rozszerzenia i na głównym dysku (tylko dla czasu; trochę wolno - tak jak zasugerował Brian - ale tak samo jest z wyszukiwaniem w Eksploratorze Windows; dlatego zainstalowałem aplikację Everything search).
Alternatywa #1: FOR /R
Najlepsza(?) Próbując zrozumieć, dlaczego rozwiązanie Briana nie zadziałało dla mnie, spojrzałem na HELP FOR i zdecydowałem się spróbować podejścia /R. (Tworzenie pliku byłoby takie samo jak w alternatywie #2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Example - Works (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 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
Alternatywa #2: FOR /F
BrianAdkins zasugerował: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
A poprawiona odpowiedź to:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
A bardziej kompletna odpowiedź z wytłumionymi katalogami i wyjściem (dołączonym) do pliku to:
@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: Druga komenda również wyłącza katalogi przez /a:-d.
Uwaga: Nazwa zmiennej FOR jest pisana wielkimi literami, aby wyjaśnić różnicę między zmienną a parametrami zmiennej, jeśli ktoś wybierze inne nazwy zmiennych.
Uwaga: Dodany do pliku tylko dla żartów, ponieważ OP prosił o wyjście do pliku.
Przypuszczam, że naprawdę powinienem sprawdzić status ECHO i zresetować go również.
Problem - spacje w nazwach_
Rozwiązanie zaproponowane przez Briana nie obsługuje nazw plików i folderów zawierających spacje (przynajmniej nie na mojej konfiguracji Visty).
Przykład - Błędny(Bez delimitacji; Zawiera tłumienie katalogu na OP, ale z rozmiarem zarówno przed jak i po nazwie pliku dla podkreślenia)
Skrócona nazwa i rozmiar (4 z 6 plików niepoprawne):
@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 - Correct(Note output to screen, not appended to file)
@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
Alternatywa #3: FORFILES (Quote Issue)
To rozwiązanie jest prosto 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 włączone.
Dodanie pustej linii oddzielającej każdy katalog byłoby trywialnym rozszerzeniem IF.
Caution : Użycie maski /m *.*
nie zwróci plików bez rozszerzenia (jak ostatni plik w przykładzie)!
Aside : To 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 co chciał OP, ale czasem się przydaje.
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 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
Ten przykład zawiera dodatkowy katalog z super długą nazwą pliku i nazwą pliku bez rozszerzenia.
Problem: Path in Quotes_
Czy istnieje zatem łatwy sposób na usunięcie niechcianych(?) cudzysłowów w przykładzie OP i zapisanie Alternative #3: FORFILES. (Pytanie retoryczne: Czy cytaty są cechą czy wadą?)