迭代目录中的所有文件,使用'for'循环

如何使用for循环遍历目录中的每个文件?

我如何判断某个条目是一个目录还是一个文件?

747717 次浏览
for %1 in (*.*) do echo %1

在cmd中尝试“HELP FOR”以获得完整的指南

这是XP命令的指南。http://www.ss64.com/nt/

%1是传入的第一个参数,不能在迭代器中使用。

试试这个:

@echo off
for %%i in (*.*) do echo %%i

这将递归地列出当前目录及其子目录中的所有文件(仅是文件):

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

此外,如果在批处理文件中运行该命令,则需要将%符号加倍。

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

(感谢@agnul)

我会使用vbscript (Windows脚本主机),因为在批处理中,我确信你不能区分一个名称是一个文件还是一个目录。

在vbs中,它可以是这样的:

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

检查MSDN上的FileSystemObject

遍历…

  • ...当前目录下的文件:for %f in (.\*) do @echo %f
  • ...subdirs在当前目录:for /D %s in (.\*) do @echo %s
  • ...当前和所有子dirs中的文件:for /R %f in (.\*) do @echo %f
  • ...当前和所有subdirs中的subdirs: for /R /D %s in (.\*) do @echo %s

不幸的是,我没有找到同时遍历文件和子dirs的任何方法。

只要使用cygwin和它的bash就可以获得更多的功能。

除此之外:你有没有注意到,MS Windows的内置帮助是描述cmd命令行的语法的一个很好的资源?

也可以看看这里:http://technet.microsoft.com/en-us/library/bb490890.aspx

从命令行运行FOR和从批处理文件运行FOR之间有细微的区别。在批处理文件中,你需要在每个变量引用前放两个%字符。

从命令行:

FOR %i IN (*) DO ECHO %i

从批处理文件:

FOR %%i IN (*) DO ECHO %%i

这个for循环将列出目录中的所有文件。

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

"delims="用于显示包含空格的长文件名....

'/b"只显示名称,不显示大小日期等。

关于dir's /a参数需要了解的一些事情。

  • 使用“/a”会列出所有内容,包括隐藏属性和系统属性。
  • “/ad”只显示子目录,包括隐藏目录和系统目录。
  • "/a-d"参数消除带有'D'irectory属性的内容。
  • "/a-d-h-s"将显示所有内容,但包含'D'irectory, 'H'idden 'S'ystem属性的条目除外。

如果在命令行上使用此命令,请删除“%”。

希望这能有所帮助。

下面的代码在当前目录中创建一个名为< em > " AllFilesInCurrentDirectorylist.txt " < / em >的文件,其中包含当前目录中所有文件(仅文件)的列表。看看吧

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

试试这个测试文件是否是目录:

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

这只会告诉你一个文件是否不是一个目录,如果文件不存在,这也会是真的,所以如果需要,一定要先检查它。插入符号(^)用于转义重定向符号,文件列表输出被重定向到NUL以防止它被显示,而DIR列表的错误输出被重定向到输出,因此您可以测试DIR的消息“file Not Found”。

我使用xcopy命令和/L选项来获取文件名。所以如果你想获取一个目录或子目录下的所有文件,你可以这样做:

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

我只是使用c:\作为目标,因为它一直存在于windows系统中,而且它不会复制,所以没关系。如果你也想要子目录,只需在最后使用/s选项。如果出于其他原因需要xcopy的其他开关,也可以使用它们。

它也可以使用forfiles命令:

forfiles /s

还要检查它是否是一个目录

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

要遍历每个文件,可以使用for循环:

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

在我的例子中,我还需要文件内容、名称等。

这导致了一些问题,我认为我的用例可能会有所帮助。下面是一个循环,它从目录中的每个“。txt”文件中读取信息,并允许你对它做一些事情(例如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!"
)

*限制:val<=%%f将只获得文件的第一行。

试试这个:

::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

它会计算目录(以及子目录)中的。msi和。exe文件。因此,作为可执行文件的文件夹和文件之间也有区别。

如果需要过滤循环中的其他文件,只需添加一个扩展名(.pptx .docx ..)

在我的情况下,我必须删除临时文件夹下的所有文件和文件夹。这就是我最后做这件事的原因。我必须运行两个循环一个文件和一个文件夹。如果文件或文件夹名称中有空格,则必须使用" "

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"
)

遍历所有文件和文件夹你可以使用

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

只遍历所有文件夹不带文件,则可以使用

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

其中/s将以无限深度给出整个目录树的所有结果。如果你想遍历该文件夹的内容,而不是其子文件夹,你可以跳过/s

在迭代中实现搜索

对于遍历指定的文件和文件夹,您可以搜索名称并使用for循环进行迭代

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

遍历指定的文件夹/目录,而不是文件,然后在同一个命令中使用/AD

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

我有麻烦得到jop的答案工作与绝对路径,直到我发现这个引用:https://ss64.com/nt/for_r.html

下面的示例循环遍历一个由绝对路径给出的目录中的所有文件。

For /R C:\absoulte\path\ %%G IN (*.*) do (
Echo %%G
)

下面是代码中的注释。

我只是在温习婊子技能,所以请原谅任何明显的错误。

我试着写一个all in one解决方案,尽我所能,在用户需要的地方做了一些修改。

如果你只想处理根目录文件和文件夹,只需将变量recursive更改为FALSE。否则,它会检查所有文件夹和文件。

最欢迎……

@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