Powershell删除特定字符文件名的开头和结尾

时间:2017-08-30 17:19:51

标签: powershell file-rename

我正在清理目录,但我的PowerShell代码出现问题。具体查找特定地点的特定字符并将其删除。

以下是我目前的目录...

_AB_.CDF
_AB__.CDF
_AB__0.CDF
_AB__1.CDF
_GH_.IJK
_GH__.IJK
_GH__0.IJK
_GH__1.IJK
L_M_N_O_.PQR
L_M_N_O__.PQR
L_M_N_O__0.PQR

我想要做的是修剪文件名开头的任何下划线和任何下划线,后跟最后的数字(如果存在)。所以它看起来像......

AB.CDF
GH.IJK
L_M_N_O.PQR

这是我到目前为止提出的代码......

Set-Location C:\somedir
Get-ChildItem -Recurse | ForEach-Object {
    $NewName = ($_.BaseName -Replace "^_|_|\d+$") + $_.Extension
    $Destination = Join-Path -Path $_.Directory.FullName -ChildPath $NewName
    Move-Item -LiteralPath $_.FullName -Destination $Destination -Force
}

它几乎可以解决问题。但是,它还会删除所有下划线实例,这些实例会留下我没有任何下划线的文件。像这样......

LMNO.PQR

我确信这个问题可能在另一篇文章中得到了解答,但是最后几个小时的搜索让我筋疲力尽。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

我会使用String.TrimStart()String.TrimEnd()方法而不是正则表达式:

$NewName = $_.BaseName.TrimStart('_').TrimEnd('_0123456789')

如果你想使用正则表达式,这可能是你正在寻找的模式:

$_.BaseName -replace '^_+|[_\d]+$'

答案 1 :(得分:1)

您想要Trim StartTrimEnd

在Powershell中,语法将是

$stringVar.TrimStart('_').TrimEnd('_')

以下是我的控制台的结果:L

 PS C:\WINDOWS\system32> $stringVar = "_AB_"
 PS C:\WINDOWS\system32> $StringVar.TrimStart('_').TrimEnd('_')
 AB
 PS C:\WINDOWS\system32> $stringVar = "L_M_N_O__"
 PS C:\WINDOWS\system32> $StringVar.TrimStart('_').TrimEnd('_')
 L_M_N_O

然后像以前一样将它与您的文件类型重新组合。