PowerShell移除文件名前缀/后缀日期的方法及Replace与-replace差异
PowerShell中String.Replace()与-replace的差异及文件名日期移除优化
一、为什么String.Replace()无效,-replace有效?
- String.Replace()是字面量替换:它会把传入的匹配字符串当成普通文本完全匹配,不会解析正则表达式语法。比如你写的
_\d{12}.,它会直接去找文件名里有没有_\d{12}.这个精确字符串,而不是识别下划线+12位数字+句点的格式,自然匹配不到目标内容,所以替换无效果。 - -replace是正则表达式替换:PowerShell的
-replace运算符默认支持正则匹配,能解析\d(匹配数字)、{n}(匹配n次重复)这类正则语法,因此可以正确识别文件名中的日期格式,完成预期替换。
二、更简洁的实现方式
可以把两种日期格式的匹配逻辑合并到一个正则表达式中,一次替换完成,无需链式调用:
$File = "D:\TESTLB\DirIn\CRIS_Invoice_202411140311.txt" $Path = Split-Path -Path $File -Parent $FileName = Split-Path -Path $File -Leaf # 同时匹配前缀YYYYMMDD. 和 后缀_YYYYMMDDHHNN.,替换为对应格式的* $CleanFileName = $FileName -replace '^(?:\d{8}\.)|(?:_\d{12}\.)', { # 根据匹配内容的开头决定替换后的格式 $_.Value.StartsWith('_') ? '_*.' : '*.' } # 示例输出:CRIS_Invoice_*.txt $CleanFileName
如果追求更紧凑的写法,也可以用正则分组实现:
$CleanFileName = $FileName -replace '^(\d{8})\.|_(\d{12})\.', { $_.Groups[1].Success ? '*.' : '_*.' }
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

