PowerShell批量复制文件:提取文件名编号并生成多份命名副本
用PowerShell批量提取编号并复制文件的解决方案
我来帮你搞定这个批量复制的需求,用PowerShell其实很容易实现,核心就是两步:精准提取文件名里的编号,然后循环执行复制操作。下面分场景给你具体的脚本和说明:
基础场景:文件名就是编号(比如001938.pdf)
如果你的原文件直接是「编号+扩展名」的格式,脚本可以非常简洁:
# 替换成你的文件所在文件夹路径 $folderPath = "C:\Your\Target\Directory" # 定义需要生成的副本后缀(原文件保留,这里是2个副本,对应你要的3份总数量) $copyNames = @(" 22", " Note") # 遍历文件夹里的PDF文件(可根据需要修改扩展名,比如*.docx) Get-ChildItem -Path $folderPath -Filter "*.pdf" | ForEach-Object { $fileNumber = $_.BaseName # 直接提取文件名(不含扩展名)作为编号 foreach ($suffix in $copyNames) { $newFile = Join-Path $folderPath "$fileNumber$suffix$($_.Extension)" # 执行复制,-Force可覆盖已存在的同名文件,可选 Copy-Item -Path $_.FullName -Destination $newFile -Force Write-Host "已生成副本:$newFile" } }
进阶场景:文件名包含编号(比如Report_001938_Feb.pdf)
如果编号是文件名中的一部分,用正则表达式就能精准提取。比如你要提取6位数字的编号,修改编号提取的逻辑即可:
$folderPath = "C:\Your\Target\Directory" $copyNames = @(" 22", " Note") Get-ChildItem -Path $folderPath -Filter "*.pdf" | ForEach-Object { # 用正则匹配文件名中的6位数字编号,可根据实际调整规则: # - \d{6} 匹配6位数字;如果是任意长度连续数字,换成 \d+ # - ^\d+ 匹配开头的数字;\d+$ 匹配结尾的数字 $matchResult = [regex]::Match($_.BaseName, '\d{6}') if ($matchResult.Success) { $fileNumber = $matchResult.Value foreach ($suffix in $copyNames) { $newFile = Join-Path $folderPath "$fileNumber$suffix$($_.Extension)" Copy-Item -Path $_.FullName -Destination $newFile -Force Write-Host "已生成副本:$newFile" } } else { Write-Warning "未在文件 $($_.Name) 中找到编号,跳过" } }
实用提示
- 测试时可以给
Copy-Item加上-WhatIf参数,比如Copy-Item ... -WhatIf,这样不会实际复制文件,只会预览操作,确认逻辑正确后再去掉该参数。 - 如果需要生成更多副本,只需在
$copyNames数组里添加更多后缀即可,比如@(" 22", " Note", " Backup")会生成3个副本,加上原文件共4份。 - 正则表达式可以灵活调整,比如你的编号是字母+数字组合,可改成
[A-Z0-9]{6}之类的规则。
内容的提问来源于stack exchange,提问作者WernerCD
相关产品推荐
相关产品推荐

