批处理文件仅列出树中每个目录的第一个文件并将结果输出到文本文件中

Batch file to list only the first file from every directories in a tree and output the results in a text file

我想制作一个批处理文件,以仅列出树中每个目录的第一个文件,该树包含数百个子目录,并将结果输出到文本文件中。

到目前为止,我找到了一种在单个目录中执行此操作的方法,但它在树中不起作用。

for /f "delims=" %%F in ('dir /b /o-n') do set file=%%F
echo %file% >>filelist.txt

我尝试将 /s 添加到目录,但它只列出最后一个目录的第一个文件。

如果您想要带路径的文件名,则:

@(For /F Delims^= %%G In ('Dir /B/S/AD/ON')Do @Set "}=?"&For /F "EOL=? Delims=" %%H In ('Dir "%%G" /B/A-D/ON 2^>NUL')Do @If Defined } Echo %%G\%%H&Set "}=")>"filelist.txt"

如果您只需要文件名,则类似地:

@(For /F Delims^= %%G In ('Dir /B/S/AD/ON')Do @Set "}=?"&For /F "EOL=? Delims=" %%H In ('Dir "%%G" /B/A-D/ON 2^>NUL')Do @If Defined } Echo %%H&Set "}=")>"filelist.txt

但是请注意,上述方法在输出每个目录的第一个文件后仍会枚举每个目录,因此如果其中一个或多个目录中有很多文件,则可能不是最有效的方法.

在这种情况下,Call 标签可能更有效:

@(For /F Delims^= %%G In ('Dir /B/S/AD/ON')Do @Call:Sub "%%G")>"filelist.txt"
@GoTo :EOF
:Sub
@For /F "EOL=? Delims=" %%G In ('Dir %1 /B/A-D/ON 2^>NUL')Do @Echo "%~1\%%G"&Exit /B
@Echo ;"%~1"&Exit /B

上面的示例旨在打印不包含子文件的目录,并以分号为前缀。如果您不想要这些,则只需从最后一行中删除 Echo ;"%~1"&。另外,如果您不想要完整路径,只需从倒数第二行中删除 %~1\


如果您想在每次迭代时输出到文件,而不是只在最后写入所有输出,(根据 ,然后以下是对第一个示例的改编,向您展示如何做到这一点:

@For /F Delims^= %%G In ('Dir /B/S/AD/ON')Do @Set "}=?"&For /F "EOL=? Delims=" %%H In ('Dir "%%G" /B/A-D/ON 2^>NUL')Do @If Defined } Echo "%%G\%%H">>"filelist.txt"&Set "}="