Iteracja wszystkich plików w katalogu za pomocą pętli 'for'

Jak mogę iterować każdy plik w katalogu używając pętli for?

A skąd mam wiedzieć, czy dany wpis jest katalogiem, czy tylko plikiem?

Author: Peter Mortensen, 2008-09-26

17 answers

Wyświetla listę wszystkich plików (i tylko plików) w bieżącym katalogu:

for /r %i in (*) do echo %i

Również jeśli uruchomisz to polecenie w pliku wsadowym, musisz podwoić znaki%.

for /r %%i in (*) do echo %%i

(dzięki @ agnul)

 523
Author: jop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 16:48:19

Iterate through...

  • ...pliki w bieżącym katalogu: for %f in (.\*) do @echo %f
  • ...subdirs in current dir: for /D %s in (.\*) do @echo %s
  • ...pliki w podkatalogach bieżących i wszystkich: for /R %f in (.\*) do @echo %f
  • ...subdiry w bieżącym i wszystkich subdirach: for /R /D %s in (.\*) do @echo %s

Niestety nie znalazłem sposobu na iterację plików i subdirów w tym samym czasie.

Po prostu użyj cygwin z bash dla znacznie większej funkcjonalności.

Poza tym: czy zauważyłeś, że buildin pomoc MS Windows czy jest to świetny zasób do opisów składni wiersza poleceń cmd?

Zobacz też: http://technet.microsoft.com/en-us/library/bb490890.aspx

 227
Author: Marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-05 13:45:02

Aby iterować nad każdym plikiem, będzie działać pętla for:

for %%f in (directory\path\*) do ( something_here )

W moim przypadku chciałem również zawartość pliku, nazwę itp.

prowadzi to do kilku problemów i pomyślałem, że mój przypadek użycia może pomóc. Oto pętla, która odczytuje informacje z każdego '.txt ' plik w katalogu i pozwala zrobić coś z nim (na przykład setx).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

*ograniczenie: val

 87
Author: Aaron Votre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 13:54:52

Istnieje subtelna różnica między uruchomieniem FOR z linii poleceń a z pliku wsadowego. W pliku wsadowym należy umieścić dwa znaki % przed każdym odniesieniem do zmiennej.

Z linii poleceń:

FOR %i IN (*) DO ECHO %i

Z pliku wsadowego:

FOR %%i IN (*) DO ECHO %%i
 59
Author: aphoria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-28 12:10:31

Ta pętla for wyświetli listę wszystkich plików w katalogu.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims=" jest przydatny do wyświetlania długich nazw plików ze spacjami....

'/b " Pokaż tylko nazwy, Nie daty rozmiaru itp..

Kilka rzeczy, które warto wiedzieć o kłótni dir ' S /A.

  • każde użycie "/ a " wyświetli wszystko, łącznie z atrybutami ukrytymi i systemowymi.
  • "/ ad " pokazuje tylko podkatalogi, w tym ukryte i systemowe.
  • argument"/a-d" eliminuje zawartość za pomocą ' d ' irectory atrybut.
  • " / A-d-h-s" pokaże wszystko, ale wpisy z atrybutem 'd 'irectory', ' h ' S ' System.

Jeśli użyjesz tego w wierszu poleceń, Usuń"%".

Mam nadzieję, że to pomoże.
 44
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 11:49:38

%1 odnosi się do pierwszego argumentu przekazanego i nie może być użyty w iteratorze.

Spróbuj tego:

@echo off
for %%i in (*.*) do echo %%i
 11
Author: Sam Meldrum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 09:52:34
for %1 in (*.*) do echo %1

Spróbuj "HELP FOR" W cmd, aby uzyskać pełny przewodnik

To jest poradnik dla poleceń XP. http://www.ss64.com/nt/

 5
Author: Axeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 12:37:19

Miałem problem z uzyskaniem odpowiedzi jop na pracę ze ścieżką absolutną, dopóki nie znalazłem tego odniesienia: https://ss64.com/nt/for_r.html

Poniższy przykład zapętla wszystkie pliki w katalogu podanym przez ścieżkę bezwzględną.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
 5
Author: datchung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-25 20:35:49

Do iterować przez wszystkie pliki i foldery możesz użyć

for /F "delims=" %%a in ('dir /b /s') do echo %%a

Do iteruj tylko przez wszystkie foldery nie z plikami, wtedy możesz użyć

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

Gdzie /s Da wszystkie wyniki w drzewie katalogów w nieograniczonej głębi. Możesz pominąć /s, Jeśli chcesz iterować przez zawartość tego folderu, a nie jego podfolderu

Implementowanie wyszukiwania w iteracji

Do iteracji poprzez określone nazwane pliki i foldery ty może wyszukiwać nazwę i iterować za pomocą pętli for

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

Aby iterować przez określone foldery / katalogi, a nie Pliki , następnie użyj /AD w tym samym poleceniu

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
 4
Author: jafarbtech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-28 12:14:47

Poniższy kod tworzy plik o nazwie " / align = "left" / txt" w bieżącym katalogu, który zawiera listę wszystkich plików (tylko pliki) w bieżącym katalogu. Sprawdź to

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
 3
Author: Ankur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 09:21:02

Może również użyć komendy forfiles :

forfiles /s 

A także sprawdzić, czy jest to katalog

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
 3
Author: Max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-23 11:01:33

Użyłbym vbscript( Windows Scripting Host), ponieważ w partii jestem pewien, że nie można powiedzieć, że nazwa jest plikiem lub katalogiem.

W vbs może być coś takiego:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

Sprawdź FileSystemObject na MSDN .

 2
Author: Biri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 09:56:26

Używam polecenia xcopy z opcją /L, aby uzyskać nazwy plików. Więc jeśli chcesz uzyskać katalog lub wszystkie pliki w podkatalogu, możesz zrobić coś takiego:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

Po prostu używam c:\ jako miejsca docelowego, ponieważ zawsze istnieje na systemach windows i nie jest kopiowany, więc nie ma znaczenia. jeśli chcesz podkatalogów też po prostu użyj opcji /s na końcu. Możesz również użyć innych przełączników xcopy, jeśli potrzebujesz ich z innych powodów.

 2
Author: Knoots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-29 19:45:50

Spróbuj sprawdzić, czy plik jest katalogiem:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

To tylko powie Ci, czy plik nie jest katalogiem, co również będzie prawdą, jeśli plik nie istnieje, więc upewnij się, że najpierw to sprawdzisz, jeśli zajdzie taka potrzeba. Karetki ( ^ ) są używane do ucieczki symboli przekierowania, a wyjście listy plików jest przekierowywane do NUL, aby zapobiec wyświetleniu go, podczas gdy wyjście listy błędów jest przekierowywane do wyjścia, dzięki czemu można przetestować komunikat DIR "File Not Found".

 2
Author: sugerfunk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-23 11:00:55

Spróbuj tego:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder
Liczy się .msi i .pliki exe w katalogu (i w podkatalogu). Tak więc robi to również różnicę między folderami i plikami jako plikami wykonywalnymi.

Wystarczy dodać rozszerzenie (.pptx .docx ..) jeśli chcesz filtrować inne pliki w pętli

 2
Author: Littlepony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 10:38:32

Oto moja propozycja z komentarzami w kodzie.

Po prostu odświeżam swoje umiejętności, więc wybacz wszelkie rażące błędy.

Próbowałem napisać rozwiązanie wszystko w jednym najlepiej jak potrafię z małą modyfikacją, gdy użytkownik tego wymaga.

Kilka ważnych uwag: po prostu zmień zmienną recursive na FALSE jeśli chcesz przetwarzać tylko pliki i foldery katalogów głównych. W przeciwnym razie przechodzi przez wszystkie foldery i pliki.

C & C most Witam...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls
 2
Author: Ste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-24 22:35:04

W moim przypadku musiałem usunąć wszystkie pliki i foldery pod folderem tymczasowym. Więc tak to zrobiłem. Musiałem uruchomić dwie pętle, jedną dla pliku i jedną dla folderów. Jeśli pliki lub foldery mają spacje w nazwach, musisz użyć ""

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)
 1
Author: Sam B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 17:54:47