PowerShell正则文件重命名:提取编号与重组名称的实现问题
解决PowerShell正则重命名发票文件的问题
嘿,我懂你卡在正则这步的烦恼了——其实不用绕着存临时变量再删来删去,直接用正则精准捕获你需要的两个核心部分(NAME和发票号),就能一步生成新文件名,效率高多了。
先理清文件名结构
你的原文件名格式很明确:
NAME Invoice N° 2020010001 01_01_2020.pdf
NAME:无空格的连续字符组(长度可变,这是关键前提)- 固定中间段:
Invoice N°(注意前后的空格,必须精准匹配) - 发票号:纯数字串(比如
2020010001) - 尾段:后面的日期和
.pdf是我们不需要保留的冗余内容
正则表达式方案
直接写一个正则,一次性捕获NAME和发票号两个关键组:
^([^\s]+) Invoice N° (\d+) .+\.pdf$
拆解一下逻辑:
^([^\s]+):捕获组1,匹配开头所有非空格字符,也就是你的NAMEInvoice N°:精准匹配固定的中间文本(前后空格不能丢,不然匹配不上)(\d+):捕获组2,匹配发票号的纯数字部分.+\.pdf$:匹配从发票号到.pdf结尾的所有冗余内容(这部分会被丢弃)
PowerShell完整脚本实现
下面是带校验的完整脚本,能避免误操作,还能预览效果:
# 获取当前目录下所有符合原格式的PDF文件,先过滤掉不符合的 $targetFiles = Get-ChildItem -Filter "*.pdf" | Where-Object { $_.Name -match '^([^\s]+) Invoice N° (\d+) .+\.pdf$' } foreach ($file in $targetFiles) { # 从匹配结果里提取NAME和发票号 $customerName = $matches[1] $invoiceNum = $matches[2] # 构造新文件名 $newName = "$invoiceNum $customerName.pdf" # 先加-WhatIf预览操作,确认没问题再删掉这个参数执行真实重命名 Rename-Item -Path $file.FullName -NewName $newName -WhatIf }
-WhatIf参数:加上它只会打印重命名计划,不会实际修改文件,安全测试必备- 过滤逻辑:只处理符合格式的文件,避免对其他无关PDF误操作
单独测试正则匹配
如果你想先验证正则是否能正确捕获内容,可以跑这段测试代码:
$testFileName = "AcmeCorp Invoice N° 2020010001 01_01_2020.pdf" if ($testFileName -match '^([^\s]+) Invoice N° (\d+) .+\.pdf$') { Write-Host "捕获到NAME: $($matches[1])" Write-Host "捕获到发票号: $($matches[2])" }
运行后会输出:
捕获到NAME: AcmeCorp 捕获到发票号: 2020010001
内容的提问来源于stack exchange,提问作者MDUB77
相关产品推荐
相关产品推荐

