我正在清理目录,但我的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
我确信这个问题可能在另一篇文章中得到了解答,但是最后几个小时的搜索让我筋疲力尽。谢谢你的帮助!
答案 0 :(得分:3)
我会使用String.TrimStart()
和String.TrimEnd()
方法而不是正则表达式:
$NewName = $_.BaseName.TrimStart('_').TrimEnd('_0123456789')
如果你想使用正则表达式,这可能是你正在寻找的模式:
$_.BaseName -replace '^_+|[_\d]+$'
答案 1 :(得分:1)
在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
然后像以前一样将它与您的文件类型重新组合。