批处理文件; 列出目录中的文件,仅文件名?

181

这可能是一个非常简单的问题,但我遇到了困难。

我正在尝试编写一个批处理文件,并且需要列出特定目录中的所有文件。 dir 命令可以做到这一点,但它还会提供许多其他信息;我希望它只列出 文件名 并排除其他任何信息。

我只想让输出看起来像这样:

file1.txt
file2.txt
file3.txt

可能是Suppress directory names being listed with DIR的重复问题。 - Helen
9个回答

336

完整的命令是:

dir /b /a-d

让我来分解一下;

基本上,/b 是你要找的东西。

/a-d 将排除目录名称。


要获取更多信息,请参阅 dir /? 以查看您可以与 dir 命令一起使用的其他参数。


12
没问题,对我来说可以 :) dir /b /a-d > tmp.txt - Stéphane GRILLON
4
不能使用/S选项同时获取子目录中的文件名。 - Farhan Ghumra
1
@xyroid你有看到seltene /a-d将会排除目录名称吗? - Stephan
4
如果我想打印子目录中文件的名称,那么这并不会被排除。 - Farhan Ghumra
2
这非常接近我所需的。我需要绝对路径并递归到子目录中。这是我使用的命令:dir /B /A-D /S - EmpathicSage
显示剩余7条评论

44

你也可以尝试这个:

for %%a in (*) do echo %%a
使用 for 循环,您可以将当前目录中的所有文件名使用 echo 输出。
要直接从控制台打印它们:
for %a in (*) do @echo %a

18
  • 为什么不使用where而不是dir?

在命令行中:

for /f tokens^=* %i in ('where .:*')do @"%~nxi"

在批处理/cmd文件中:

@echo off 

for /f tokens^=* %%i in ('where .:*')do %%~nxi
  • 输出:

file_0003.xlsx
file_0001.txt
file_0002.log

where .:*
  • 输出:

G:\SO_en-EN\Q23228983\file_0003.xlsx
G:\SO_en-EN\Q23228983\file_0001.txt
G:\SO_en-EN\Q23228983\file_0002.log

递归实现如下:

where /r . *
  • 输出:

G:\SO_en-EN\Q23228983\file_0003.xlsx
G:\SO_en-EN\Q23228983\file_0001.txt
G:\SO_en-EN\Q23228983\file_0002.log
G:\SO_en-EN\Q23228983\Sub_dir_001\file_0004.docx
G:\SO_en-EN\Q23228983\Sub_dir_001\file_0005.csv
G:\SO_en-EN\Q23228983\Sub_dir_001\file_0006.odt
  • 使用For循环获取路径和文件名:

  • 在命令行中:

for /f tokens^=* %i in ('where .:*')do @echo/ Path: %~dpi ^| Name: %~nxi
  • 在bat/cmd文件中:
@echo off 

for /f tokens^=* %%i in ('where .:*')do echo/ Path: %%~dpi ^| Name: %%~nxi
  • 输出:

 Path: G:\SO_en-EN\Q23228983\ | Name: file_0003.xlsx
 Path: G:\SO_en-EN\Q23228983\ | Name: file_0001.txt
 Path: G:\SO_en-EN\Q23228983\ | Name: file_0002.log

  • 使用for循环递归获取路径和名称:

在命令行中:

for /f tokens^=* %i in ('where /r . *')do @echo/ Path: %~dpi ^| Name: %~nxi

在批处理/cmd文件中:

@echo off 

for /f tokens^=* %%i in ('where /r . *')do echo/ Path: %%~dpi ^| Name: %%~nxi
  • 输出:

 Path: G:\SO_en-EN\Q23228983\ | Name: file_0003.xlsx
 Path: G:\SO_en-EN\Q23228983\ | Name: file_0001.txt
 Path: G:\SO_en-EN\Q23228983\ | Name: file_0002.log
 Path: G:\SO_en-EN\Q23228983\Sub_dir_001\ | Name: file_0004.docx
 Path: G:\SO_en-EN\Q23228983\Sub_dir_001\ | Name: file_0005.csv
 Path: G:\SO_en-EN\Q23228983\Sub_dir_001\ | Name: file_0006.odt


@kakyo 感谢您的评论... 当前路径 == . 并且所有文件 == * - Io-oI
谢谢你的测试! - Io-oI

14

1.打开记事本

2.创建新文件

3.输入下面的行:

dir /b > fileslist.txt

4.保存 "list.bat" 文件。

就这样。现在你可以将"list.bat"文件复制到任何一个文件夹位置,双击它,它将在该目录文件夹中创建一个"fileslist.txt"以及文件名列表。

示例输出:enter image description here

注意:如果您想要创建一个包括子文件夹的文件名列表,那么您可以创建一个带有以下代码的批处理文件。

dir /b /s > fileslist.txt

3
如果我不想将输出文件“fileslist.txt”包含在列表中怎么办? - Behnam
dir行上方使用del fileslist.txt - CAD bloke
1
@Behnam,然后使用findstr排除它,即dir /b /s | findstr /VI "filelist.txt" > filelist.txt" - Gerhard

8
如果您需要子目录,您需要使用“dir”命令和“For”命令。
dir /b /s DIRECTORY\*.* > list1.txt

for /f "tokens=*" %%A in (list1.txt) do echo %%~nxA >> list.txt

del list1.txt

在dir命令中输入你的根目录。它将创建一个包含完整路径名的list1.txt文件,然后创建一个只包含文件名的list.txt文件。


为什么?这是不必要的开销。只需执行 for /R %%i in (*) do echo (%%~nxi)>list.txt - Gerhard

4
创建一个批处理文件,包含以下代码:
dir %1 /b /a-d > list.txt

然后将一个目录拖放到其中,该目录中的文件将在list.txt中列出


3

Windows 10:

  1. 打开命令提示符(cmd)

  2. 切换到你想要创建文本文件(movie_list.txt)的目录(d:\videos\movies)

  3. 输入以下命令

    d:\videos\movies> dir /b /a-d > movie_list.txt


2
在PowerShell中,dir使用Get-ChildItem,你可以使用PowerShell命令来过滤它:
dir | select { $_.Name }

我现在不确定该怎么做。你帮了我,但这个问题是针对批处理而不是PowerShell的。 - sanitizedUser

1

dir /s/d/a:-d "folderpath*.*" > file.txt

在不需要子文件夹中的文件时,去掉/s。


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