使用“for”循环迭代目录中的所有文件

446

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

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


1
假设您指的是默认的Windows shell,我已经重新标记了您的帖子以获得更清晰的说明。 - David Schmitt
2
请同时指明您使用的Windows版本。 - jop
1
这应该分成两个独立的问题,因为它们彼此独立。 - julealgon
17个回答

3

我使用xcopy命令并带有/L选项来获取文件名。因此,如果您想获取目录或子目录中的所有文件,可以像这样操作:

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

我之所以选择 c:\ 作为目标路径,是因为它在 Windows 系统中总是存在,并且不需要复制,所以无关紧要。如果您还想复制子目录,请在末尾使用 /s 选项。如果您需要其他开关,也可以使用 xcopy 的其他开关。


3
它还可以使用forfiles命令:
forfiles /s 

同时检查它是否是一个目录

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

@isdir==true needs to be @isdir==TRUE - psyklopz

3
以下代码在当前目录中创建一个名为"AllFilesInCurrentDirectorylist.txt"的文件,其中包含当前目录中所有文件(仅限文件)的列表。请查看它。
dir /b /a-d > AllFilesInCurrentDirectorylist.txt

2

尝试使用以下方法来测试文件是否是目录:

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的“文件未找到”消息进行测试。


2

试试这个:

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


2
我会使用VBScript(Windows脚本宿主),因为在批处理中,我不确定你是否能够判断一个名称是文件还是目录。
在VBScript中,可以像这样实现:
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


我本想使用Perl来完成这个任务。不幸的是,这并不由我决定。 - Vhaerun
一些老的应用程序?令人悲伤的事情。 - Biri
一个愚蠢的开发者看到批处理文件,认为它们是解决我们所有问题的灵丹妙药。 - Vhaerun
1
@Vhaerun Windows脚本宿主(WSH)相对于Perl的一个优势是WSH预装在所有Windows版本中,而Perl需要单独安装,这可能并非在所有情况下都是可行的选项。 - Parampreet Dhatt

1

在我这种情况下,我需要删除临时文件夹下的所有文件和文件夹。因此,我最终是这样做的。我必须运行两个循环,一个用于文件,一个用于文件夹。如果文件或文件夹名称中有空格,则必须使用“”。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接