You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell正则文件重命名:提取编号与重组名称的实现问题

解决PowerShell正则重命名发票文件的问题

嘿,我懂你卡在正则这步的烦恼了——其实不用绕着存临时变量再删来删去,直接用正则精准捕获你需要的两个核心部分(NAME和发票号),就能一步生成新文件名,效率高多了。

先理清文件名结构

你的原文件名格式很明确:

NAME Invoice N° 2020010001 01_01_2020.pdf

  • NAME:无空格的连续字符组(长度可变,这是关键前提)
  • 固定中间段:Invoice N°(注意前后的空格,必须精准匹配)
  • 发票号:纯数字串(比如2020010001)
  • 尾段:后面的日期和.pdf是我们不需要保留的冗余内容

正则表达式方案

直接写一个正则,一次性捕获NAME和发票号两个关键组:

^([^\s]+) Invoice N° (\d+) .+\.pdf$

拆解一下逻辑:

  • ^([^\s]+):捕获组1,匹配开头所有非空格字符,也就是你的NAME
  • Invoice 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:02:33