How do you iterate over each file in a directory with a .bat or .cmd file?
For simplicity please provide an answer that just echoes the filename or file path.
Command line usage:
for /f %f in ('dir /b c:\') do echo %f
Batch file usage:
for /f %%f in ('dir /b c:\') do echo %%f
Update: if the directory contains files with space in the names, you need to change the delimiter the for /f
command is using. for example, you can use the pipe char.
for /f "delims=|" %%f in ('dir /b c:\') do echo %%f
Update 2: (quick one year and a half after the original answer :-)) If the directory name itself has a space in the name, you can use the usebackq
option on the for
:
for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f
And if you need to use output redirection or command piping, use the escape char (^
):
for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Alternatively, use:
forfiles /s /m *.png /c "cmd /c echo @path"
The forfiles command is available in Windows Vista and up.
Easiest method:
From Command Line, use:
for %f in (*.*) do echo %f
From a Batch File (double up the % percent signs):
for %%f in (*.*) do echo %%f
From a Batch File with folder specified as 1st parameter:
for %%f in (%1\*.*) do echo %%f
dir /B
output with for
.
Use
for /r path %%var in (*.*) do some_command %%var
with:
path being the starting path.
%%var being some identifier.
*.* being a filemask OR the contents of a variable.
some_command being the command to execute with the path and var concatenated as parameters.
%%var was unexpected at this time.
Can you give an exact example? I tried a bunch of variations of for /r . %%var in (*.*) do echo %%var
Another way:
for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
"%~nf"
stands for name of the file without extension, where f
is the name of the variable specified in for
part. Docs: docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
I had some malware that marked all files in a directory as hidden/system/readonly. If anyone else finds themselves in this situation, cd into the directory and run for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f
.
ATTRIB -S -H -R /S /D *.*
(/S Processes files in sub-directories, /D processes folders too)
Success story sharing
/f
needed after thefor
? According to the help docs, the/f
flag opens and reads each file. Is that needed to echo or rename files?/f
afterFOR
restricts it to files. Similarly,/d
restricts to directories (folders) and/r
instructs it to be recursive.'dir /b "c:\program files"'
it should be`dir /b "c:\program files"`