Powershell从文件名中删除特殊字符

时间:2016-06-17 00:54:23

标签: regex powershell special-characters character-replacement rename-item-cmdlet

我正在寻找一种通过powershell脚本从文件名中删除几个特殊字符的方法。

我的文件名如下所示:

[报告] _first_day_of_month_01_(generated_by_powershell)_ [repnbr1]的.txt

我一直在为删除[]以及它们之间的所有内容,()以及它们之间的所有内容以及删除所有_的问题一直困惑,所需的结果是一个如下所示的文件名:< / p>

01.txt的第一天

到目前为止,我尝试了以下解决方案无济于事。我从文件所在的目录中运行了每一个。

Get-ChildItem -Path .\ -Filter *.mkv | %{
$Name = $_.Name
$NewName = $Name -Replace "(\s*)\(.*\)",''
$NewName2 = $NewName -Replace "[\s*]\[.*\]",''
$NewName3 = $NewName2 -Replace "_",' '
Rename-Item -Path $_ -NewName $NewName3
}

因为即使我尝试在这样的时间做一套,它也不起作用:

Get-ChildItem -Path .\ -Filter *.mkv | %{
$Name = $_.Name
$NewName = $Name -Replace "(\s*)\(.*\)",''
Rename-Item -Path $_ -NewName $NewName
}

我认为我试图完成这项任务的方式存在固有的缺陷。话虽这么说,我宁愿使用Rename-Item cmdlet而不是使用移动项解决方案。

1 个答案:

答案 0 :(得分:1)

gci *.txt | Rename-Item -NewName {$_ -replace '_*(\[.*?\]|\(.*?\))_*' -replace '_+', ' '}

重命名是匹配[text](text)块的正则表达式,并且不替换它们。括号和括号需要在正则表达式中转义以便按字面意思匹配它们。它将它们与可选的前导或尾部下划线匹配,以获得[Report]__[repnbr1],因为它会在名称的开头或结尾留下_,它们将成为前导/尾随空格,这是烦人。然后用空格替换剩余的下划线。

请参阅此处的正则表达式:Regex101