Próbuję wygenerować plik tekstowy zawierający nazwę pliku (w tym pełną ścieżkę) i rozmiar pliku dla wszystkich plików w określonym katalogu i dowolnym z jego podkatalogów (tj. Rekurencyjnie). Idealnie, nie chcę przecinków w rozmiarze pliku (ale zadowolę się nimi!)
Następujące polecenie to robi, ale bez rozmiaru pliku:
dir /b /s /a:-D > results.txt
Przykładowy wynik wygląda następująco:
C:\Users\Martin\Pictures\Table\original\PC120013.JPG 227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG 123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG 932344
Nie sądzę, że jest to możliwe przy użyciu dir
samego, chociaż chciałbym, aby udowodniono, że się mylę. Czy istnieje inny sposób, aby to zrobić, używając tylko poleceń dostępnych z wiersza polecenia?
źródło
"tokens=*"
następująco@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
pliku?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
- Wyniki wszystkich wcześniejszych procesów są zapisywane w pliku tekstowym o nazwie VideoList . Użycie jednego > spowoduje nadpisanie pliku ( jeśli już istnieje ), a użycie >> spowoduje dodanie nowych wyników na końcu, jeśli plik tekstowy ( jeśli już istnieje ). Jeśli plik tekstowy jeszcze nie istnieje, to polecenie zapisuje nowy plik o określonej nazwie.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
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).
Przykład - działa (inny katalog niż powyżej, aby zademonstrować rekurencję)
Alternatywa # 2: FOR / F
Sugerowane przez Briana Adkinsa:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Skorygowana odpowiedź brzmi:
Pełniejsza odpowiedź z katalogów tłumione i wyjścia (załączony) do pliku jest:
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):
Przykład - Prawidłowo (uwaga wyprowadzana na ekran, nie dołączana do pliku)
Alternatywa # 3: FORFILES (problem z wyceną )
To rozwiązanie pochodzi bezpośrednio z dwóch ostatnich przykładów w dokumentacji FORFILES (
forfiles /?
).Połączenie tych przykładów i zapisanie do pliku daje odpowiedź (prawie):
Zauważ, że ścieżka jest w cudzysłowie na wyjściu.
Nie ma znaczenia, czy
echo on
czyecho 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)
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ą?)
źródło
Zdaję sobie sprawę, że wymaga to dodatkowej użyteczności , ale możesz to dość zwięźle osiągnąć za pomocą narzędzia sfk :
( Podjąłem podejście za pomocą łączenia łańcuchów komend sfk tutaj )
źródło
To może oszukiwać w kwestii PO. Pytanie to nie jest jednak istotne w nowoczesnych systemach Windows. Alias Dir został użyty, aby narysować łącze logiczne.
źródło
powershell "Get-ChildItem -Recurse| select name,length"
Poniżej znajduje się to, czego użyłem do zlokalizowania różnych plików wideo, które zajmowały zbyt dużo miejsca na dysku sieciowym i zapisania wyników w pliku tekstowym na lokalnym komputerze.
Publikuję własną, nieco spóźnioną odpowiedź z trzech powodów. Po pierwsze, lubię zwięzłe odpowiedzi. Po drugie, ten jeden wiersz skryptu działał dla mnie w wielu ustawieniach, w tym w sieci. Po trzecie, według potencjalnie niejasnego komentarza Dona Vince'a pod odpowiedzią BrianaAdkinsa, użycie tokenów może ominąć problemy z nazwami plików ze spacjami w nich.
for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt
Zauważyłem, że bardzo długie ścieżki / nazwy plików (setki znaków) mogą również powodować błędy, ale wyszukiwanie się na nich nie zawiesi. Jednak ścieżka nie jest w pełni zbadana dla celów. Po odnotowaniu można to zrekompensować, uruchamiając głębiej strukturę folderów, aby wyeliminować ten błąd.
Ta strona ss64 ma bardzo dobrą prezentację użycia polecenia dir , zawierającą listę wszystkich przełączników, wiele kombinacji przełączników oraz kilka użytecznych przykładów poprawnej składni. Nie jest tak wszechstronny, jak różne społeczności Stack Exchange, ale w prezentacji jest wyraźna, gdy tylko zaznajomisz się z wierszem poleceń / skryptami wsadowymi.
źródło
Osiągnąłem to za pomocą następującego polecenia:
Wynik:
PS Jest to oparte na odpowiedzi BillR (Alternative # 1). Jednak w moim przypadku się to utrzymuje
@echo off
.źródło
Uważam, że polecenie „du” jest bardzo pomocne i działa zarówno w systemie Windows, jak i Unix (użyłem go do sprawdzenia, czy wszystkie pliki zostały skopiowane podczas przesyłania dużej ilości danych z komputera z systemem Windows na serwer Linux w sieci Web):
wyjścia:
Widziałem jednak tylko znaki specjalne w Notatniku, a nie w Notepad ++ (musi to być jakieś kodowanie ANSI / UTF-8, nie ma czasu na dokładne analizowanie w tej chwili). Nie znalazłem również rozwiązania, aby wyświetlić rozmiar po nazwie pliku. Użyj opcji „b” lub „k” zamiast „h”, aby wyświetlić rozmiar w bajtach lub kilobajtach. Miałem trochę problemów podczas uruchamiania polecenia poza folderem, który chcę analizować. Dlatego najlepiej zarówno wpisać polecenie w odpowiednim katalogu (w tym przykładzie „C: \ twój_katalog”), jak i podać je w poleceniu.
źródło
Pomiń b w dir / b / s / a: -D> results.txt, a wyniki powinny wyglądać następująco: (tj. Dir / s / a: -D> results.txt):
źródło
Bez nadmiernego komplikowania powinno to zapewnić pożądaną wydajność. Daje to nieco więcej, niż wymagał PO, ale pomyślałem, że warto o tym wspomnieć. Dodaj przełącznik / R, aby określić katalog inny niż bieżący.
źródło
ERROR: Invalid syntax. Value expected for '/r'
więc wróć do tablicy kreślarskiej i podaj poprawną składnię i edytuj swoją odpowiedź z poprawnymi szczegółami.where /?
mówi: „Domyślnie wyszukiwanie odbywa się wzdłuż bieżącego katalogu i ścieżek określonych przez zmienną środowiskową PATH . ”- więc twojewhere * /t
polecenie wyświetla wszystkie pliki wC:\Windows\System32
, niektóre podkatalogiC:\Program Files
i każdy inny katalog wPATH
. Dla mnie było to ponad 3000 linii. Proszę rozważyć edycję swojej odpowiedzi, aby była uzasadniona. PS Bez/R
, to nie jest rekurencyjne.