Jak zrobić coś dla każdego pliku w katalogu za pomocą skryptu wsadowego

265

Jak iterować każdy plik w katalogu z plikiem .bat lub .cmd?

Dla uproszczenia proszę podać odpowiedź, która po prostu odzwierciedla nazwę pliku lub ścieżkę pliku.

Brian R. Bondy
źródło

Odpowiedzi:

348

Wykorzystanie wiersza poleceń:

for /f %f in ('dir /b c:\') do echo %f

Wykorzystanie pliku wsadowego:

for /f %%f in ('dir /b c:\') do echo %%f

Aktualizacja : jeśli katalog zawiera pliki ze spacjami w nazwach, musisz zmienić separator, którego for /fużywa polecenie. na przykład możesz użyć znaku potoku.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Aktualizacja 2 : (szybko półtora roku po oryginalnej odpowiedzi :-)) Jeśli nazwa katalogu ma spację w nazwie, możesz użyć usebackqopcji na for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

A jeśli chcesz użyć przekierowania wyjściowego lub potoku poleceń, użyj znaku esc ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Franci Penov
źródło
3
Przynajmniej dla niektórych poleceń zmienna pliku powinna być ujęta w podwójne cudzysłowy.
Jirka
1
Dlaczego jest /fpotrzebny po for? Zgodnie z dokumentami pomocy /fflaga otwiera się i odczytuje każdy plik. Czy jest to potrzebne do echa lub zmiany nazwy plików?
Snekse
17
/fPo FORogranicza ją do plików. Podobnie /dogranicza się do katalogów (folderów) i /rnakazuje rekurencję.
3
+1 To jest żywa odpowiedź, do której nieustannie się uczęszcza; Wielkie dzięki.
Sabuncu
4
Właśnie zdałem sobie sprawę, że musisz użyć cudzysłowów ... Zamiast 'dir /b "c:\program files"'tego powinno być`dir /b "c:\program files"`
endavid
101

Alternatywnie użyj:

forfiles /s /m *.png /c "cmd /c echo @path"

Polecenie forfiles jest dostępne w systemie Windows Vista i nowszych.

Paul Houx
źródło
1
używanie ścieżek ze spacjami w drugiej powłoce cmd było trudne. Na koniec dostosowałem% PATH% env var, aby wykonać zadanie. Ale dzięki. pomocny
twobob
70

Najłatwiejsza metoda:

Z wiersza poleceń użyj:

for %f in (*.*) do echo %f

Z pliku wsadowego (dwukrotnie znak% procent):

for %%f in (*.*) do echo %%f

Z pliku wsadowego z folderem określonym jako pierwszy parametr:

for %%f in (%1\*.*) do echo %%f
Gordon Bell
źródło
8
nie tylko najłatwiejszy, ale także znacznie bardziej elegancki w porównaniu do oceny dir /Bwydajności za pomocą for.
syneticon-dj
5
Dodaj a / r przed% f, aby ponownie wyświetlić podkatalogi
PRMan
35

Posługiwać się

for /r path %%var in (*.*) do some_command %%var

z:

  • ścieżka jest ścieżką początkową.
  • %% var jest jakimś identyfikatorem.
  • *. * jest maską pliku LUB zawartością zmiennej.
  • some_command jest poleceniem do wykonania ze ścieżką i zmienną var połączoną jako parametry.
mstrobl
źródło
2
Pojawia się błąd: %%var was unexpected at this time.czy możesz podać dokładny przykład? Wypróbowałem kilka odmianfor /r . %%var in (*.*) do echo %%var
hippietrail
3
Z jakiegoś dziwnego powodu nazwa zmiennej jest ograniczona do jednego znaku.
ollb
2
Czy możemy używać różnych emotikonów dla różnych rezultatów?
Silver Quettier
-1

Miałem złośliwe oprogramowanie, które oznaczało wszystkie pliki w katalogu jako ukryte / systemowe / tylko do odczytu. Jeśli ktokolwiek znajdzie się w takiej sytuacji, przejdź do katalogu i uruchom for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Zaraz
źródło