使用 PowerShell 删除文件名结尾

Remove end of filename using PowerShell

是否可以使用 PowerShell 删除文件夹中所有文件的文件名结尾?示例:

所以我想删除从 "by" 到“.jpg”的所有内容。

是的,你可以使用 LastIndexOf() method on the files BaseName to find out where to cut it off, then use Substring():

Set-Location C:\path\to\folder

Get-ChildItem -Path $PWD -Filter "*.jpg" |ForEach-Object {
    if(($lastIndex = $_.BaseName.LastIndexOf("_by_")) -ne -1){
        $NewName = "{0}{1}" -f $_.BaseName.Substring(0, $lastIndex),$_.Extension
        Rename-Item $_.FullName -NewName $NewName
    }
}

如果LastIndexOf()找不到我们正在寻找的子字符串(在本例中为_by_),它returns -1,在这种情况下什么都不应该完成

我会使用 ForEach 循环来完成,就像这样:

gci e:\temp\*.jpg | % {
Rename-Item -path $_.FullName -NewName "$($_.Name.Substring(0,$_.Name.LastIndexOf('by')))$($_.Extension)" -WhatIf }

What if: Performing the operation "Rename File" on target "Item: E:\temp\moira_by_kr0npr1nz-d8poqdb.jpg Destination: E:\temp\moira_.jpg".
What if: Performing the operation "Rename File" on target "Item: E:\temp\redemptionthe_hunters_by_danluvisiart-d8oy1ef.jpg Destination: E:\temp\redemptionthe_hunters_.jpg"
What if: Performing the operation "Rename File" on target "Item: E:\temp\shining_eyestep_by_step_by_ryky-d8pp6xh.jpg Destination: E:\temp\shining_eyestep_by_step_.jpg".

逻辑是我们得到我们想要的文件列表(例如所有 JPG),然后我们使用 ForEach-Object 遍历它们,并指定 NewName 参数来更改名称。

我将分解引号内发生的事情:

  1. 取 Name 并找到单词 'by' 最后一次出现,其中 returns 字符串中的数字位置(索引)
  2. 使用 SubString 命令 select 从字符串开头到上面的所有内容,从开头到单词 'by' 最后一次出现的所有内容。
  3. 获取文件的原始扩展名,确保我们将其附加到末尾。

我在一个有几个像这样的文件的目录上测试了它,它非常有效。 运行 一次使用 -WhatIf,这样您就可以看到会发生什么。如果你喜欢你所看到的,运行 不带 -WhatIf。

像这样使用正则表达式替换怎么样:

Get-ChildItem -Filter "*.jpg" | % {
    Rename-Item $_.FullName -NewName ($_.FullName -replace '_by_.*\.jpg$', '')
} 

如果正则表达式未找到匹配项,则文件名保持不变。