PowerShell文件重命名正则表达式失效问题求助
问题分析与解决
原脚本的问题
- 正则语法错误:原表达式里的
(\d\d})多了多余的闭合大括号},导致日期匹配失败;同时未转义.,正则中.代表任意字符,匹配pdf前的点必须写成\.。 - 未覆盖文件名前缀:原文件名开头的
specificLeaderString没被正则匹配到,替换规则无法作用于整个文件名。 - 格式不符合需求:原脚本生成带方括号的文件名,和你要的
yyyyMMdd newSfx.pdf格式不符。
正确的重命名脚本
简洁版(直接正则替换)
Get-ChildItem -Filter "*.pdf" | Rename-Item -NewName { $_.Name -replace '^.*(\d{4})-(\d{2})-(\d{2})\.pdf$', '$1$2$3 SmithChq.pdf' }
说明:
Get-ChildItem -Filter "*.pdf":只处理PDF文件,避免误操作其他类型文件。- 正则
^.*(\d{4})-(\d{2})-(\d{2})\.pdf$:^.*匹配文件名开头的任意前缀(比如specificLeaderString)(\d{4})-(\d{2})-(\d{2})捕获4位年份、2位月份、2位日期\.pdf$匹配文件名结尾的.pdf(转义.避免匹配任意字符)
- 替换字符串
$1$2$3 SmithChq.pdf:把捕获的年月日拼接成无连字符格式,加上指定后缀。
稳妥版(增加格式校验)
如果怕有不符合格式的文件,可先校验再重命名:
Get-ChildItem -Filter "*.pdf" | ForEach-Object { # 匹配带日期的文件名前缀 if ($_.BaseName -match '^.*(\d{4})-(\d{2})-(\d{2})$') { # 拼接无连字符的日期字符串 $dateString = "$($matches[1])$($matches[2])$($matches[3])" # 生成新文件名 $newFileName = "$dateString SmithChq.pdf" # 执行重命名 $_ | Rename-Item -NewName $newFileName } }
内容的提问来源于stack exchange,提问作者G.G G99
相关产品推荐
相关产品推荐

