使用PowerShell删除文件名结尾

时间:2015-04-14 20:22:21

标签: powershell filenames rename

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

  • moira_by_kr0npr1nz-d8poqdb.jpg
  • shining_eye ___ step_by_step_by_ryky-d8pp6xh.jpg
  • 赎回___ the_hunters_by_danluvisiart-d8oy1ef.jpg

所以我想删除" by"到" .jpg"。

3 个答案:

答案 0 :(得分:1)

是的,您可以在文件BaseName上使用LastIndexOf()方法找出将其剪切的位置,然后使用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_),则会返回-1,在这种情况下不应执行任何操作

答案 1 :(得分:0)

我会使用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. 取名字,找到最后一次单词' by'出现,它返回字符串内部的数字位置(索引)
  2. 使用SubString命令选择从字符串开头到上面的所有内容,从开头直到单词' by'最后一次出现。
  3. 抓取文件的原始扩展名,并确保将其追加到最后。
  4. 我在一个像这样的文件的目录上测试了这个,它就像一个魅力。使用-WhatIf运行一次,这样你就可以看到会发生什么。如果您喜欢所看到的内容,请在不使用-WhatIf的情况下再次运行。

答案 2 :(得分:0)

如何使用正则表达式替换如此:

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

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