先问个问题:电脑里堆了几百个文件的时候,你怎么把它们变成一份清单?是挨个右键复制文件名,还是手打一遍?我有一次帮朋友整理孩子班级的期末试卷扫描件,一个文件夹里327个PDF,班主任要一份按学号排列的文件清单。我一开始用右键一个个“重命名+复制”,二十分钟就崩溃了。后来发现这事根本不用折腾,Windows自带的命令、Excel的隐藏函数、甚至浏览器控制台,几十秒就能把全部文件名提取出来。这就是批量提取文件名的核心价值——把“肉眼可见的文件名”变成“可复制、可筛选、可汇总”的文本数据。
这篇文章把这些方法整理成了5招,从最简单的不需要任何基础,到进阶的递归导出、过滤筛选、批量改名,覆盖了日常办公和资料归档的绝大多数场景。不管你是行政、财务、教师、设计师,还是经常跟素材文件打交道的运营和程序员,总有一招能直接用上。
1. 批量提取文件名有哪些思路?先搞懂3个选择维度
1.1 你真正需要的是“文件名”,还是“文件信息”
很多人一上来就搜“批量提取文件名工具”,下载了一堆软件,结果发现要么收费、要么捆绑安装包、要么功能过剩根本用不上。实际上,提取文件名之前,先要搞清楚你要的是哪种输出。
如果你只是要一份可以复制、编辑的文字清单,那Windows自带的命令和脚本就足够了;如果你要把文件名放进Excel表格,和已有的台账做匹配、筛选、去重,那最好是直接在Excel里生成,省去复制粘贴;如果你要整理的是多层子文件夹里的散落文件,那普通命令就抓瞎了,必须用支持递归扫描的方式。
我见过不少同事直接把所有文件名复制进Word,再用查找替换清理,效率低不说,还容易漏。搞清楚自己的需求属于哪一种,再选招数,才不会绕弯路。
1.2 选方案前先问自己3个问题
选工具和方案之前,建议先问三个问题:
- 这台电脑能不能联网、能不能装软件?很多公司内网电脑权限受限,能用的只有系统自带能力。
- 你习惯用命令行吗?如果看到黑窗口就头疼,第1、2招也完全够用,不需要学PowerShell。
- 文件有多少、要不要带子文件夹?几十个文件和几千个文件,用到的方案完全不同。
为了方便对照,我把这5招的基本情况列成了一张表:
| 招数 | 使用工具 | 命令基础要求 | 是否需要装软件 | 最合适场景 |
|---|---|---|---|---|
| 第1招 | Windows自带cmd | 低 | 否 | 临时快速导出,30秒解决 |
| 第2招 | 记事本+bat脚本 | 低 | 否 | 长期重复使用,双击即生成 |
| 第3招 | Excel/WPS内置函数 | 低 | 否 | 文件名要进入表格做数据处理 |
| 第4招 | Chrome/Edge控制台 | 中 | 否 | 不想开黑窗口、偶尔折腾一次 |
| 第5招 | Windows PowerShell | 中高 | 否 | 递归目录、过滤类型、多维导出 |
单看这张表,前4招覆盖了大多数人的日常需求,第5招更适合习惯脚本化和需要批量处理的高级用户。下面我按顺序展开讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第1招:Windows自带cmd命令,30秒导出文件名清单
2.1 最简单的做法:把文件夹拖进cmd窗口
第一步,Windows键加R,输入cmd,回车,打开命令提示符。
第二步,在cmd窗口里输入cd /d,接着拿鼠标把目标文件夹直接拖进cmd窗口,松开后会看到路径自动填上了,按回车。
第三步,输入这行命令:
bat复制dir /b > 文件名清单.txt
回车后,重新打开资源管理器,你会在文件夹里看到一个“文件名清单.txt”,打开就是全部文件名。
这里解释两个细节。第一,拖文件夹进cmd窗口时,系统会自动给路径加上引号,即使用户文件夹路径里有空格也不会出错。第二,b是“bare format”的意思,让dir命令只输出文件名,不带大小、日期、权限这些额外信息,正好是清单需要的格式。
2.2 dir /b 参数拆解与常见变体
有人会问,能不能只导出特定类型的文件?能不能带上子文件夹?能不能不要扩展名?这些都只需要在刚才的命令上做微调。
只导出PDF文件:
bat复制dir /b *.pdf > pdf清单.txt
递归提取子文件夹里的所有文件(会带相对路径):
bat复制dir /b /s > 全部文件清单.txt
只输出文件名、不输出扩展名(这个稍微复杂一点,用到了for循环):
bat复制for %F in (*) do @echo %~nF >> 文件名清单.txt
注意,最后这条命令是命令行里用的写法,如果写进bat脚本,要把%F改成%%F。%~nF的意思就是“取文件名、去掉扩展名”,这是cmd里一个很实用的变量扩展语法。
重定向符号>和>>的区别也要留意:>会覆盖已有文件,>>是追加到末尾。重复运行时如果不想保留旧内容,用>就行,每次会生成全新的清单。
3. 第2招:双击运行bat小脚本,一键生成清单
3.1 写一个“零基础版”bat脚本
第1招虽然快,但每次都要打开cmd、输入命令,还是有点麻烦。如果你隔三差五就要整理一次文件,建议把命令写成一个bat脚本,以后放到任何文件夹里双击,自动生成清单。
用记事本新建一个文件,复制下面这段内容:
bat复制@echo off
chcp 65001 >nul
cd /d "%~dp0"
dir /b > "文件名清单.txt"
echo 清单已生成,请查看文件名清单.txt
pause
保存的时候注意:文件类型选择“所有文件”,文件名写成“提取文件名.bat”,编码选择“ANSI”。以前有人保存成UTF-8,结果双击运行时bat命令里的中文乱码,虽然清单本身还是能生成,但echo提示信息会显示成一堆乱码,观感不好。
这段脚本里有几个容易踩坑的地方,我挨个说明。
chcp 65001是把cmd的代码页切换成UTF-8,这样dir输出的中文文件名不会出现乱码。>nul表示这段命令的输出不要显示,只是静默执行。
cd /d "%~dp0"的作用是把当前目录切换到脚本所在的文件夹。%~dp0是bat脚本的一个内置变量,永远代表“这个脚本自己所在的路径”。双击运行时,当前目录不一定是脚本所在目录,必须加这一句,否则清单会生成到别的地方去。
3.2 把bat变成可复用的“小工具”
这个脚本最舒服的地方在于:复制“提取文件名.bat”放到任何一个文件夹里,双击,马上生成清单。不需要安装任何软件,不需要打开任何工具,连命令行窗口都不用管。
如果你要递归子文件夹,把dir /b改成dir /b /s,清单里就会带上子目录的相对路径。如果只想列出子文件夹中某些类型的文件,比如整理所有jpg图片,可以写成:
bat复制dir /b /s *.jpg > "jpg文件清单.txt"
有两点经验供参考。一是bat文件本身也会出现在dir /b的输出里,比如脚本叫“提取文件名.bat”,生成清单时它自己也会被列进去,介意的话可以手动删掉这一行,或者在命令里用排除逻辑,但普通场景下没必要纠结。二是脚本文件名不要包含中文特殊符号,尽量用“提取文件名.bat”这样的命名,避免某些精简版系统对含特殊字符的文件名处理异常。
4. 第3招:Excel函数直接列出文件名,表格化最方便
4.1 FILES宏表函数是什么,为什么推荐
如果文件名提取出来只是为了看,前面两招就够了。但很多时候,我们需要的是把文件名做成Excel清单,再去和台账比对、分类、筛选。这时候如果还靠复制粘贴,几千个文件真的会让人崩溃。
Excel里有一个很老的宏表函数,叫FILES,它可以直接获取某个文件夹下的所有文件名,并以数组形式返回。它不需要写VBA,不需要启用宏,不需要另存为xlsm,只要通过“名称管理器”定义一下,就能像普通函数一样在单元格里使用。这是很多老会计和文员都知道的小技巧,知道的人多,真正会用的人少。
4.2 三步走:名称管理器+INDEX下拉
假设你的文件都在D盘的“合同备份”文件夹下,路径是D:\合同备份,想把这些文件名全部列到Excel的A列。
第一步,打开Excel,按Ctrl+F3打开“名称管理器”,点击“新建”。
第二步,在“名称”里填一个自定义名字,比如“文件名列表”,在“引用位置”里输入:
text复制=FILES("D:\合同备份\*.*")
点击确定。
第三步,回到工作表,在A1单元格输入:
text复制=IFERROR(INDEX(文件名列表,ROW(A1)),"")
然后向下拖动填充到足够多的行。这时A列就会依次出现文件夹里的所有文件名,直到最后一个文件,之后再下拉会显示为空。
这里面的逻辑拆解一下:FILES函数返回的是一个隐藏的数组,INDEX的第二个参数用ROW(A1)作为序号,向下拖一格就变成ROW(A2),也就是取第2个文件名,依次类推。IFERROR的作用是让超出范围的部分返回空值,而不是显示刺眼的#REF!错误。
4.3 边界情况:文件名带特殊字符、Excel版本兼容
实际操作中会遇到几个小问题。
第一,路径不能写错。FILES里面的路径必须是完整的绝对路径,路径末尾的*.不能省略,.代表所有文件。想筛选特定类型,可以改成.pdf、*.jpg。如果路径中间有空格,直接写中文路径也能识别,不需要额外加引号。
第二,Excel版本兼容性。这个函数在Excel 2007到Excel 365、WPS表格里都能用,但WPS里有些版本对宏表函数的支持不太稳定,如果发现返回#NAME?,大概率是名称管理器里没有正确启用或者版本问题,可以试试重新录入一遍,或者改用后续第5招的方案。
第三,子文件夹是列不出来的。FILES函数只能列指定文件夹的直接文件,不会递归子目录。如果想连子文件夹的文件一起列进来,建议直接用PowerShell导出,再粘贴进Excel,一步到位。
5. 第4招:浏览器控制台复制文件名,不装软件也能用
5.1 核心原理:用file协议让浏览器显示文件列表
如果你身边没有Excel、也不想碰命令行的黑窗口,还有一个“野路子”——用浏览器打开本地文件夹,再从控制台提取文件名。
原理很简单:在Chrome或Edge地址栏输入file:///加上文件夹路径,浏览器会把本地目录渲染成一个简单的文件列表页面,每个文件都是一个链接。我们只需要用JavaScript把这些链接的文本批量抓出来就行。
打开Chrome或Edge,地址栏输入:
text复制file:///D:/合同备份
注意file后面是三个斜杠。按回车后,页面会列出该文件夹下的所有文件和子文件夹。如果路径里有中文,浏览器通常会自动做URL编码,直接复制粘贴完整中文路径也能访问,少数版本不支持的话,可以用文件夹拖拽的方式——把文件夹拖到浏览器窗口的标签页上,会直接打开对应的file页面。
5.2 控制台JS提取文件名清单
页面打开后,按F12打开开发者工具,点击Console(控制台)标签,粘贴下面这段代码,按回车:
javascript复制[...document.querySelectorAll('a')].map(a => a.textContent).join('\n')
控制台会输出一个用换行符分隔的文件名字符串,右键点击这段输出,选“Copy”或直接Ctrl+A、Ctrl+C复制,然后粘贴到Excel、TXT、Word都可以。
如果想直接下载成文件,可以换一段更完整的代码,自动生成一个“文件名清单.txt”并触发下载:
javascript复制(() => {
const text = [...document.querySelectorAll('a')].map(a => a.textContent).join('\n');
const blob = new Blob([text], {type: 'text/plain;charset=utf-8'});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = '文件名清单.txt';
a.click();
URL.revokeObjectURL(a.href);
})();
粘贴后按回车,浏览器会自动下载这个txt文件。
5.3 这招的局限与适用场景
这招其实更适合“不常折腾电脑、看到命令行就发怵”的人应急用。它最大的优势是使用频率超高的浏览器就能搞定,不需要安装任何东西,也不影响系统设置。
局限也明显:一是子文件夹不能自动递归,file协议页面只会显示当前目录下的内容;二是如果文件数量特别大,比如上万个文件,浏览器渲染列表会卡,控制台输出也会很长;三是对浏览器的本地文件访问策略有一定依赖,极少数企业定制版浏览器可能会禁用file协议,那就没办法了。
我个人的建议是:把这招当作“备用技能”,偶尔用一次很惊艳,但别把它当成主力方案。真要处理大量文件,第5招的PowerShell会更加可控。
6. 第5招:PowerShell进阶玩法,递归/过滤/多维导出
6.1 从Get-ChildItem开始,一行命令输出文件名
PowerShell是Windows自带的脚本环境,能力比cmd强太多,而且也是系统内置,不需要装任何软件。在开始菜单右键(或按Win+X)选择“Windows PowerShell”或“终端”,就可以开始操作。
最基础的命令:
powershell复制Get-ChildItem -Name
这个命令会输出当前目录下所有文件和文件夹的名字。如果只想输出文件、不输出文件夹,加上-File参数:
powershell复制Get-ChildItem -Name -File
导出到txt文件:
powershell复制Get-ChildItem -Name -File | Out-File -FilePath "文件名清单.txt" -Encoding UTF8
这行命令里的管道符|是核心。Get-ChildItem把文件对象传给Out-File,Out-File负责写入文件,分工很清晰。很多人第一次接触PowerShell会觉得管道难懂,其实可以理解成“把上一段命令的结果,交给下一段命令继续处理”,和工厂流水线的传送带一个道理。
6.2 递归、过滤、排序、导出CSV一条龙
PowerShell最厉害的地方在于多条件组合。日常办公里高频的几个场景,我直接列命令出来。
递归扫描所有子文件夹,导出完整路径清单:
powershell复制Get-ChildItem -Recurse -File | Select-Object -ExpandProperty FullName | Out-File "全部文件路径.txt" -Encoding UTF8
只提取PDF,并且按修改日期倒序排列:
powershell复制Get-ChildItem -Recurse -Filter *.pdf -File | Sort-Object LastWriteTime -Descending | Select-Object -ExpandProperty Name
把文件名、修改日期、大小、所在目录一并导出成CSV,方便直接在Excel里继续处理:
powershell复制Get-ChildItem -File | Select-Object Name, LastWriteTime, Length, DirectoryName | Export-Csv "文件信息清单.csv" -NoTypeInformation -Encoding UTF8
这里有几个参数值得单独说。Recurse表示递归所有子文件夹;Filter比通配符的匹配速度更快,建议优先使用;Select-Object用于挑选要输出的列;-ExpandProperty的作用是把这些列从对象里“提取”成纯文本,而不是显示成表格形式的对象。第一次用的时候不用全记住,当成模板复制修改就好。
6.3 顺手把“批量改名”也解决了
很多时候,提取文件名只是第一步,真正让人头疼的是文件太多不好改名。PowerShell既然都上手了,批量改名也可以一起做掉。
批量把所有“客户合同_”开头的文件改成“2024合同_”开头:
powershell复制Get-ChildItem -File -Filter "客户合同_*" | Rename-Item -NewName { $_.Name -replace "客户合同_", "2024合同_" }
批量把文件名中的空格替换成下划线:
powershell复制Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace " ", "_" }
这里面的逻辑是:Rename-Item的-NewName参数接受一个脚本块,$_代表当前文件对象,-replace是PowerShell的替换运算符。改名前建议先找一个小文件夹测试,确认替换规则符合预期后再大规模执行,不然误改之后恢复起来很麻烦。
PowerShell的另一个优势是编码可控。历史遗留的Out-File -Encoding UTF8在Windows PowerShell 5.1里会带BOM,Excel能正常识别;在PowerShell 7里默认不带BOM,反而更符合跨平台要求。无论哪种情况,导出的txt/CSV用Excel打开基本不会出现中文乱码。
7. 常见问题与排查技巧实录
7.1 导出TXT后中文乱码,怎么处理
这是最常遇到的问题。cmd下使用dir /b导出中文文件名时,如果没执行chcp 65001,或者bat文件编码不对,生成的txt很可能乱码。
解决办法有三个方向,首选PowerShell的Out-File -Encoding UTF8;其次在cmd里先执行chcp 65001再运行dir命令;最后还可以用记事本打开乱码的txt,另存为时手动选择“UTF-8”或“ANSI”编码,也能修复大部分显示问题。
7.2 文件名里有空格、&符号,bat脚本报错
Windows文件名里允许出现空格和&,但这些字符在cmd和bat里有特殊含义,容易导致命令执行异常。比如文件夹名是“财务 发票(2024)”,直接写cd /d D:\财务 发票(2024)会被cmd拆成两段。
标准做法是统一加双引号,例如cd /d "D:\财务 发票(2024)"。上面第2招的脚本里,dir /b > "文件名清单.txt"已经加了引号,目录切换也用了"%~dp0",所以正常使用不会出问题。如果你自己修改脚本路径时一定要记得加双引号。
7.3 只想要文件名不想要扩展名/路径,该用哪个参数
三种情况的命令我再集中列一次。
cmd中只要文件名、不要扩展名:
bat复制for %F in (*) do @echo %~nF
PowerShell中只要文件名、不要路径:
powershell复制Get-ChildItem -File | Select-Object -ExpandProperty BaseName
cmd带/s递归导出时,清单里会带相对路径,想只要纯文件名,用PowerShell的Name属性更干净:
powershell复制Get-ChildItem -Recurse -File | Select-Object -ExpandProperty Name
7.4 文件数量太多时Excel下拉卡顿
用第3招FILES函数时,如果文件夹里有几千个文件,下拉填充几千行会让Excel变卡,而且文件列表不会自动刷新。这时候可以改用PowerShell导出CSV后直接打开,既不影响原数据的完整性,也不会频繁触发Excel的重算机制。把PowerShell的导出命令存成一个.ps1脚本,以后更新清单时改一下路径重新运行就行。
我还遇到过一种情况:导出的清单里有重复文件名,这是因为系统里开了“隐藏已知文件类型的扩展名”,用户看到的文件名和实际文件名不一致,导致以为自己提取错了。建议在资源管理器“查看”里勾选“文件扩展名”,看清楚真实名称再做后续处理。
我个人在实际操作中的体会是,最常用的组合是第2招和第5招:bat脚本扔进文件夹双击生成基础清单,遇到需要递归、过滤、排序和批量改名的复杂需求,就直接开PowerShell敲几行命令。这几招用熟了之后,整理文件不再是苦力活,反而变成了一件顺手就能完成的小事。
最后再分享一个小技巧:无论用哪招,导出的清单文件建议统一放到目标文件夹的上一级目录,或者生成后立刻改名加日期,比如“文件清单_20250216.txt”,避免下一次运行脚本时把之前的清单也一起混进去。这个小细节能省掉不少二次清理的时间。
