windows日常
约 568 字大约 2 分钟
2025-04-07
过滤当前目录下的文件名
在Windows命令行中,可以通过以下方法提取当前目录下文件名的特定字段:
若只是在当前窗口打印文件名,可以用以下命令
Get-ChildItem # 同时列出文件类型、最后修改时间、文件名
Get-ChildItem -Name # 只列出文件名
Get-ChildItem -File -Name >list.txt # 讲结果输出到文件方法1:直接提取主文件名(无扩展名)
for %F in (*) do echo %~nF- 效果:
若文件名为document-v1.txt,输出document-v1。 - 说明:
%~nF表示仅提取文件名(去除扩展名)。
方法2:按分隔符分割并提取字段
假设文件名用分隔符(如 - 或 _)分段,例如 report-2023-Q4.docx:
提取第一个字段(如 report)
for /f "tokens=1 delims=-_" %a in ('dir /b *.*') do echo %a提取第二个字段(如 2023)
for /f "tokens=2 delims=-_" %a in ('dir /b *.*') do echo %a参数解释:
tokens=1:选择分割后的第1个字段。delims=-_:指定分隔符为-和_。- 调整
tokens=数字可提取不同位置的字段。
方法3:使用PowerShell(更灵活)
Get-ChildItem | ForEach-Object { $_.Name.Split('-')[0] }- 效果:
若文件名为project-summary.docx,输出project。 - 说明:
Split('-')按-分割,[0]取第一个字段。支持正则表达式,例如提取特定模式(提取文件名中的4位数字(如2023)) :
Get-ChildItem | ForEach-Object { if ($_.Name -match "(\d{4})") { $matches[1] } }将结果输出到指定文件
- 方法一:
Get-ChildItem -File | ForEach-Object { $_.Name.Split('-')[0] } > output.txt- 方法二:
Get-ChildItem | ForEach-Object { $_.Name.Split('-')[0] } | Out-File -FilePath .\output.txt注意事项:
- 编码问题:
PowerShell 默认输出编码为UTF-16,若需保存为UTF-8,添加-Encoding UTF8参数:
Get-ChildItem | ForEach-Object { $_.Name.Split('-')[0] } | Out-File -FilePath .\output.txt -Encoding UTF8- 排除目录:
如果目录中包含子文件夹,默认会列出,若只需文件,添加-File参数:
Get-ChildItem -File | ForEach-Object { $_.Name.Split('-')[0] } > output.txt适用场景
方法1:仅需去除文件扩展名时。
方法2:文件名有固定分隔符(如日志文件
error_202304.log)。方法3:复杂需求(如不规则分隔符或正则匹配)。
