ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows下5种方法快速导出文件名清单:CMD与PowerShell实战

Windows下5种方法快速导出文件名清单:CMD与PowerShell实战 一提到“把文件夹里几百个文件名导出来”很多人第一反应是打开资源管理器一个个复制或者截图再手动敲。碰到文件一多或者层级一深这种操作基本就是灾难。其实Windows自带的CMD和PowerShell就能很干净地解决这个问题不需要装任何第三方工具也不需要写复杂的程序。这篇文章直接给你5种能落地的办法从最简单的单层目录导出到带递归、带格式处理的完整方案都有覆盖日常办公、批量归档、程序开发辅助这些常见场景。新手照着复制命令就能用老手也可以看看里面的参数组合和编码处理细节省去自己试错的时间。我先把这5种方法做个总览方便你按需选择然后每一种都展开讲清楚命令的用法、输出效果和适用场景最后再分享一些我在实际使用中踩过的坑和验证过的细节。1. 五种方法先睹为快从暴力导出到精细控制在正式开始之前先给这5种方法画个像让你有个整体概念用的时候也好对号入座。下面的表格是我根据自己的使用频率和场景整理的你可以直接参考。方法核心工具一句话定位典型输出方法一dir /b最轻量一根命令搞定文件名列表纯文件名一行一个方法二cmd /c dir /b /s递归获取所有子目录文件带相对路径含相对路径的文件名方法三PowerShellGet-ChildItem最灵活正统可以高度自定义输出可带扩展名、完整路径、大小、日期等信息方法四PowerShellcmd /c dir配合混合模式在PowerShell里直接调用CMD输出CMD风格结果并进一步清洗方法五tree /f树状预览结构感最强适合人工阅读核对以树形结构展示所有文件简单概括一下方法一和方法二属于CMD派优点是快、写法固定、几乎没有兼容性问题方法三和方法四属于PowerShell派优势在于能管能筛能格式化适合对输出有更高要求的场景方法五是“快照式”的文件结构展示适合做归档预览不适合直接当列表用。下面逐一拆解每种方法我都配了实际命令、执行思路和实测输出效果你照着敲就行。2. CMD派系一条命令拿到完整文件名列表2.1 方法一用dir /b获取纯文件名列表先把最简单、最高效的方案给你。打开CMDcd到目标目录然后执行dir /b/b参数是“裸格式”的意思也就是只显示文件名不带日期、大小、权限这些冗余信息。这是CMD里最克制也最实用的输出方式。如果你想把结果直接保存到文本文件里用重定向符号dir /b 文件名列表.txt执行完之后目录下会生成一个文件名列表.txt内容就是一行一个文件名的清单。我用一个包含图片、文档和Excel文件的混合目录实测了一下输出效果是这样季度汇报.docx 产品照片_01.jpg 产品照片_02.jpg 报价单.xlsx 封面设计.png有几个细节值得注意 文件名列表.txt的重定向文件本身不会出现在清单里。因为CMD是先枚举文件列表再创建输出文件所以清单里绝不会包含自己这一点实测过很多次不用担心。结果是按文件名的字母顺序排序的这是CMDdir的默认行为不需要额外加/o参数对日常归档来说非常友好。默认会同时显示文件和子文件夹的名称。如果只想看文件不想要文件夹可以加/a-d参数dir /b /a-d 文件名列表.txt提示想获取当前目录的完整路径可以在CMD里执行cd后直接回车CMD会把当前路径打印出来。配合dir /b可以手动拼出完整输出路径。这个方法适用于目录结构简单、只要浅层文件名、对后续处理要求不高的场景。比如整理合同扫描件、导出某个下载目录里的文件名清单几秒钟就能搞定。2.2 方法二用dir /b /s带路径递归获取所有文件如果目标文件夹下面还有多层子文件夹你想把整个目录树里的所有文件名都导出来那就得用/s参数了。dir /b /s 全目录文件清单.txt加上/s之后CMD会递归遍历当前目录下的所有子目录输出结果是每个文件的完整路径而且路径是相对路径的形式。实测输出长这样C:\Users\用户\Desktop\素材库\季度汇报.docx C:\Users\用户\Desktop\素材库\images\产品照片_01.jpg C:\Users\用户\Desktop\素材库\images\产品照片_02.jpg C:\Users\用户\Desktop\素材库\excel\报价单.xlsx这个相对路径的“相对”是相对当前CMD所在目录而言的但输出还是以盘符全路径的形式展示。有些场景下你可能只要文件名不要路径那可以改成dir /b /s /a-d | findstr /v \\ 文件名纯列表.txt这个写法用了findstr做了一次过滤筛选把带反斜杠的行都去掉从而保留纯文件名。但说实话这段命令在遇到文件名本身就含特殊字符的时候偶尔会出幺蛾子实操中如果觉得不稳我建议直接用后面的PowerShell方案处理“递归取纯文件名”会干净得多。方法二最大的优势是一条命令拿到完整目录树对备份前的文件清点、交接时的资产盘点非常实用。文件再多一个回车下去清单就有了。2.3 CMD操作中最容易忽略的两个前置条件用CMD做文件名导出有两件事经常被新手忽略但对结果影响很大第一工作目录必须正确。CMD里要先cd到你要操作的文件夹或者直接在资源管理器的地址栏输入cmd并回车这样打开的CMD窗口会直接定位到当前文件夹。我强烈推荐后者比手敲cd路径省事得多也避免了路径输错的低级问题。第二中文文件名的编码问题。老版本的CMD默认代码页是GBK936到了Windows 10之后很多环境默认是UTF-865001。如果你导出的清单在Excel里打开出现中文乱码大概率是编码不一致导致的。最简单的规避办法是在文件开头改一下代码页chcp 65001执行完这行命令之后再跑dir /b 文件名列表.txt输出的文本文件就是UTF-8编码了。不过要提醒你有时候改了65001之后CMD窗口里显示的中文会变成乱码但写入文件的内容反而是正常的。这个现象比较反常但实测确实存在所以建议你导出后先用记事本打开验证一下确认无误再做下一步处理。3. PowerShell派系灵活到你想像不到的进阶导出方案CMD的方案胜在短平快但如果你需要对文件名做筛选、拼接、格式化或者要导出的不只是文件名还要带文件大小、修改时间那PowerShell才是真正的主力。PowerShell 5.1在Windows 10和Windows 11上都是预装的不需要额外安装直接WinR输入powershell回车就能用。3.1 方法三用Get-ChildItem获取文件名并自定义输出PowerShell里的Get-ChildItem对应CMD的dir但能力完全不是一个量级。最基础的用法是Get-ChildItem | Select-Object Name得到的就是当前目录下所有文件包含文件夹的名称列表只显示名字这一列。但这样在屏幕上显示列表可能会分页或者截断更好的做法是直接输出到文件Get-ChildItem -Name 文件名清单.txt-Name参数直接返回名字的字符串集合写文件干净利落不会有多余的空行或格式错乱。实测输出季度汇报.docx 产品照片_01.jpg 产品照片_02.jpg 报价单.xlsx 封面设计.png跟方法一的输出看起来差不多但PowerShell的方案后劲大。你想加筛选条件直接加-Filter参数只导出特定类型的文件Get-ChildItem -Filter *.jpg -Name 图片清单.txt你想递归所有子目录加-RecurseGet-ChildItem -Recurse -Name 全目录清单.txt你想连带文件大小和修改日期一起导出用Select-Object组合一下Get-ChildItem | Select-Object Name, Length, LastWriteTime | Export-Csv 文件信息.csv -NoTypeInformation -Encoding UTF8这条命令会生成一个CSV文件包含了文件名、大小字节和最后修改时间。用Excel打开之后就是规整的三列表格做档案清点特别方便。-Encoding UTF8这个参数专门保证中文不乱码是我每次必带的。提示PowerShell的Get-ChildItem -Name在递归模式下输出的是带相对路径的文件路径比如images\产品照片_01.jpg跟CMD/s的效果类似但路径分隔符是反斜杠这一点在Windows上的表现是一致的。3.2 方法四在PowerShell里调用cmd /c dir做混合清洗PowerShell的管道能力很强但有些时候你偏偏喜欢CMDdir /b那个纯粹的列表格式。没关系PowerShell可以直接调用CMD命令然后继续用PowerShell的管道做二次处理cmd /c dir /b /s 原始清单.txt这其实就是在PowerShell里面跑CMD命令效果跟方法二一样。那为什么要多此一举因为你可以先拿到CMD的原始输出然后再用PowerShell去清洗、过滤、补信息。比如下面的组合$files cmd /c dir /b /s $files | Where-Object { $_ -match \.(jpg|png)$ } | Out-File 图片列表.txt -Encoding UTF8这条命令先拿到所有文件路径然后筛选出.jpg和.png结尾的最后输出到UTF-8编码的文本文件里。这是典型的“混合流”写法CMD负责快速枚举PowerShell负责精细过滤各干各擅长的事。再举个例子你想把文件名里的空格替换成下划线方便后续批处理程序读取cmd /c dir /b 待处理列表.txt (Get-Content 待处理列表.txt) | ForEach-Object { $_ -replace , _ } | Set-Content 处理后的列表.txt虽然这个需求平时直接改文件名更常见但如果是生成一份“列表”给其他程序消费这种清洗就很实用。方法四真正的价值在于让你在不放弃CMD精准输出的前提下还能享受PowerShell的管道处理能力。3.3 输出编码为什么存下来的TXT用Excel打开都是乱码关于PowerShell的输出编码问题我这里多说几句。Windows PowerShell 5.1的Out-File或者重定向默认编码是UTF-16 LE也就是带BOM的Unicode。这种编码记事本能认但很多旧版工具和部分Excel版本打开会直接乱码。而Set-Content在5.1版本里默认用的是ANSIGBK这又跟全新的UTF-8环境冲突。所以我的经验是用Out-File或Set-Content的时候强制加上-Encoding UTF8。比如Get-ChildItem -Name | Out-File 文件名清单.txt -Encoding UTF8在Windows PowerShell 5.1中-Encoding UTF8会生成带BOM的UTF-8文件Excel和记事本都能正常识别。如果你用的是PowerShell 7pwsh默认直接就是无BOM的UTF-8兼容性更好但系统预装的是5.1所以还是建议你养成手动带-Encoding UTF8的习惯。另外提醒一下不要用重定向符号搭配Get-ChildItem直接输出到文件因为PowerShell的重定向本质上也是Out-File但编码参数无法控制。想精确控制编码就用管道加Out-File -Encoding UTF8这是最稳妥的姿势。4. 树状目录法要看结构不要看列表4.1 方法五用tree /f生成可视化的目录结构快照前四种方法导出的都是“列表”适合程序处理和表格归档。但有的时候你就是想看这整个文件夹长什么样——哪个文件夹里有什么东西嵌套了几层。这时候用tree /f最合适。tree /f执行后CMD窗口会以树形结构展示当前目录的所有子目录和文件。加上/f参数表示“连文件一起显示”。效果大概是C:. ├─素材库 │ ├─季度汇报.docx │ ├─报价单.xlsx │ └─images │ ├─产品照片_01.jpg │ └─产品照片_02.jpg └─整理说明.txt这种结构对项目交付前的文件结构核对、给同事做文件组织说明非常直观。你也可以输出到文本文件tree /f 目录结构.txt然后用记事本或任何代码编辑器打开看整个目录树一目了然。注意tree /f输出的是 ANSI 编码或者说系统当前代码页对应的编码如果目录或文件名包含中文你用某些程序员编辑器打开可能会显示乱码。但用Windows自带的记事本打开基本没事因为它能自动识别本地编码。4.2 树状结构怎么变成干净的纯文件名列表很多人觉得tree /f输出没法直接用——因为带了很多树形绘制的线条符号├─、└─、│。你可以利用tree /f加一个CMD里的findstr或 PowerShell里的正则把这些结构字符剥掉只保留文件和文件夹名。最简单的思路是用PowerShell读取tree /f的输出然后按行处理去掉行首的非文字字符。tree /f 结构原始输出.txt $content Get-Content 结构原始输出.txt $clean $content | ForEach-Object { $_ -replace ^[├└│\s\-], } | Where-Object { $_ -ne } $clean | Out-File 文件名清单.txt -Encoding UTF8这套命令的思路是先用tree生成原始输出再用正则去掉行首的树形符号├、└、│、空格和短横线最后剔除空行。如果你按顺序跑完这几行得到的文件名清单.txt就是还算干净的纯名字列表层级也保留了只是失去了缩进结构。不过说实话如果你最终目的只是要纯文件名列表直接用方法一或方法三更高效。tree /f的方案更适合“先看结构再按需提取”的交互式场景或者你只有tree可用、不想记dir参数时的备用方案。5. 实战进阶批量文件名导出自动化的三个完整场景第2到第4章已经把5种方法全部讲完了。这一章我把它放到真实工作流里给你三个完整的实战场景直接复制就能用。5.1 场景一导出文件清单供Excel归档需求是把D:\Projects\案例库\下所有文件导出成Excel可读的表格包括文件名、大小、修改时间。在PowerShell中执行$path D:\Projects\案例库 Get-ChildItem $path -Recurse -File | Select-Object Name, Length, LastWriteTime, FullName | Export-Csv D:\案例库归档.csv -NoTypeInformation -Encoding UTF8注意事项-File参数只保留文件自动剔除文件夹。FullName是完整路径方便你后续追踪文件位置。Export-Csv生成的CSV用Excel打开就是规整表格。如果Excel打开后发现中文乱码右键用记事本打开CSV另存为UTF-8编码再重新用Excel打开。5.1版自带BOM通常能正常识别。5.2 场景二生成批处理所需的文件清单很多批处理脚本比如批量重命名工具需要一份“文件名列表.txt”作为输入。我在做批量图片重命名时通常会先生成清单再对清单做修改最后用循环读取清单完成重命名。dir /b /a-d *.jpg 待重命名清单.txt然后这份清单的每一行就是一个文件名批处理脚本按行读取即可echo off setlocal enabledelayedexpansion set n1 for /f delims %%i in (待重命名清单.txt) do ( ren %%i 新名称_!n!.jpg set /a n1 )这里用到的for /f读取清单、ren重命名、set /a做计数器是一个很标准的批处理套路。如果你要重命名的文件很多建议先把清单用Excel打开检查一遍避免误伤。5.3 场景三差异对比两个文件夹的文件变化当你想知道“备份文件夹相比源文件夹少了哪些文件”可以借助文件名清单快速对比。一种思路是用PowerShell直接对比$src Get-ChildItem D:\源目录 -Recurse -File | Select-Object -ExpandProperty FullName $bak Get-ChildItem D:\备份目录 -Recurse -File | Select-Object -ExpandProperty FullName Compare-Object $src $bak 差异对比.txt输出的差异对比.txt中标识仅存在于源目录中的文件标识仅存在于备份目录中的文件。这个写法比我最早用dir /b /s生成两份清单再做文本对比要快得多省去了清洗路径的麻烦。你只需要确保两个目录的根路径不同但文件相对路径结构相同对比结果才是可读的。5.4 把常用导出命令固化成一条自定义脚本如果你经常需要导出文件名清单我建议你把最常用的命令保存成一个.bat文件放到桌面上要用的时候双击就行。比如建一个导出文件名清单.batecho off chcp 65001 cd /d %~dp0 dir /b /a-d 文件名清单.txt echo 已导出到当前目录下的 文件名清单.txt pause这段脚本的含义是chcp 65001切到UTF-8代码页保证中文文件名写进文件不乱码cd /d %~dp0把工作目录切换到bat文件所在目录这样不管从哪里双击运行导出的都是bat所在目录的文件dir /b /a-d导出当前目录所有文件不带文件夹pause让窗口停住方便你看执行结果。.ps1脚本同理但PowerShell默认禁止运行脚本文件需要先在PowerShell里执行一次Set-ExecutionPolicy RemoteSigned -Scope CurrentUser放开限制。不过更简单的方式是把PowerShell命令保存为.ps1后右键选择“使用PowerShell运行”系统会询问你是否允许确认即可。提示如果你用的Windows自带杀软比较严格PowerShell脚本首次运行可能会被拦截信任你自己的脚本的话点“仍要运行”就行。6. 从踩坑到长经验编码、路径与终端的坑一个都别踩这一章写给那些想把事情一次做对的读者。以下问题我全都亲自踩过讲出来是免得你再走一遍弯路。6.1 编码问题的完整解法GBK、UTF-8和BOM一图流很多人在生成文件名清单后用记事本打开正常用Excel打开乱码帮别人处理时对方又说“看着全是乱码”最后发现是编码不统一。这里我给出一个通用解法按这个流程操作基本不会错如果只是自己用优先选择PowerShell Out-File -Encoding UTF8如果要给别人用且对方明确用Excel打开也选UTF-8带BOM的输出Windows PowerShell 5.1的天生行为如果对方用旧版系统或老软件没法识别UTF-8那就用CMDdir /b list.txt生成的ANSIGBK文件这个兼容性最广但只有在纯Windows环境是安全的如果涉及跨平台共享文件比如要在Linux或macOS上读取务必用UTF-8无BOM否则文件开头多出的BOM字符会让第一行文件名变得很奇怪。顺带提一句在CMD里想查看当前代码页输入chcp回车即可。输出65001就是UTF-8输出936就是GBK。6.2 路径里有空格这可能是脚本罢工的唯一原因Windows路径中带有空格太常见了比如D:\My Projects\素材库。CMD和PowerShell在解析路径时空格会打破默认的分词逻辑。如果你直接写cd D:\My Projects\素材库CMD会尝试寻找D:\My然后报错“系统找不到指定的路径”。正确做法是用引号包住路径cd D:\My Projects\素材库在PowerShell里也一样路径作为字符串参数时要用引号或者用反引号转义空格。最保险的写法是Set-Location -LiteralPath D:\My Projects\素材库-LiteralPath参数表示路径中的每个字符都按字面意思解释不会把方括号、空格等特殊字符当成通配符或分隔符。这是我自己在写PowerShell脚本时最常用也最稳妥的路径处理方式。6.3 导出文件的隐藏陷阱目录项、重复项和缩略名说三个比较隐蔽的坑第一隐藏文件默认不会导出。dir /b默认会跳过隐藏文件。如果想包含隐藏文件需要加/a参数或/a:h只看隐藏文件。PowerShell的Get-ChildItem -Force才会把隐藏文件也列出来。我在导出一个含隐藏配置文件的目录时第一次就漏了.gitignore之后才注意到这个差异。第二同一文件夹下有子文件夹时dir /b是混合输出的。文件名和文件夹名混在一起不想要文件夹就得加/a-d。PowerShell则要区分-File和-Directory。这个在前面提到过但实际操作中真的很容易忘。第三8.3短文件名可能导致重复记录。在某些旧格式的磁盘或特定系统设置下某些长文件名会生成短名别名比如真的很长的文件名称123.txt变成真的很~1.txt。如果你用dir /x查看会看到两行都指向同一个文件。日常导出不加/x不会出现但如果你在别人提供的批处理脚本里看到/x参数要意识到这个潜在问题。解决方案就是不用/x保持普通导出。6.4 从Windows Terminal到经典控制台换终端后行为不一致Windows 11 默认的终端是Windows Terminal而Windows 10 默认是传统控制台窗口conhost。有些命令在传统控制台下输出正常切换到Windows Terminal后可能会有编码或换行的细微差异。尤其是tree /f的树形符号├─、└─在某些字体下显示会对不齐导出的文本复制到别处可能带着奇怪的不可见字符。解决思路是如果是要进程序处理的文本尽量避免依赖tree这种“画符型”命令的输出改用dir /b /s或PowerShell的结构化导出如果是给人看的那就随便开心就好。另外还有一种情况你明明在PowerShell里跑的Get-ChildItem但终端左上角显示的还是“命令提示符”的标题栏。这是因为PowerShell在Windows Terminal里默认会继承一个叫“Windows PowerShell”的profile看起来和CMD混淆。实际上两者没有任何关系你只要确认命令行提示符是PS C:\开头就表示在PowerShell环境里了。7. 我的终极建议两种工具的组合才是生产力写了这么多核心结论其实很简单CMD像一把锋利的小刀PowerShell像一把多功能军刀两者都该在你手边。日常简单导出文件名dir /b三秒钟解决一旦涉及递归、筛选、格式化、对比立刻切换到PowerShell不要犹豫。也别在CMD里硬凑复杂的筛选逻辑那本来就是PowerShell的活。我个人现在最常用的三条命令是dir /b /a-d 文件名清单.txtGet-ChildItem -Recurse -File -Name 全目录文件名清单.txtGet-ChildItem -Recurse -File | Select-Object FullName, Length, LastWriteTime | Export-Csv 文件详细信息.csv -NoTypeInformation -Encoding UTF8最后再分享一个实用小技巧如果你经常需要在某个固定项目的文件夹里导出清单可以把这个文件夹固定到Windows Terminal的“启动目录”里或者给PowerShell配一个profile脚本启动时自动加载你常用的几个函数。这样连cd到目标目录都省了双击终端进去就在正确的位置导出成品一气呵成。这个小习惯帮我节省了大量重复操作的时间。
返回列表