【问题标题】:Powershell Remove Specific Characters Beginning and End of FilenamePowershell删除文件名开头和结尾的特定字符
【发布时间】:2017-08-30 17:19:50
【问题描述】:

我正在清理一个目录,但我的 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

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

【问题讨论】:

    标签: powershell file-rename


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我将您的解决方案合并到我的解决方案中,但随后又出现了一个丑陋的问题。这是一个很大的文件夹,虽然我认为我已经解释了所有不同类型的文件名,但最终得到了一个时髦的名称。在脚本之前,文件名是 12a3456_7.bcd。在脚本之后,它被重命名为 12a.bcd。我很好奇为什么?
    • @sudosysadmin:您想修剪文件名末尾的下划线和数字(不更改扩展名)。将 12a3456_7 修剪为 12a 符合该定义。
    • 我编辑了我的问题以使其更清楚。我需要删除所有后跟任何数字(如果存在)的下划线。
    【解决方案2】:

    你想要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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2013-01-12
      • 2011-12-22
      相关资源
      最近更新 更多