使用 PowerShell 删除文件名结尾
Remove end of filename using PowerShell
是否可以使用 PowerShell 删除文件夹中所有文件的文件名结尾?示例:
- moira_by_kr0npr1nz-d8poqdb.jpg
- shining_eye___step_by_step_by_ryky-d8pp6xh.jpg
- redemption___the_hunters_by_danluvisiart-d8oy1ef.jpg
所以我想删除从 "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 参数来更改名称。
我将分解引号内发生的事情:
- 取 Name 并找到单词 'by' 最后一次出现,其中 returns 字符串中的数字位置(索引)
- 使用 SubString 命令 select 从字符串开头到上面的所有内容,从开头到单词 'by' 最后一次出现的所有内容。
- 获取文件的原始扩展名,确保我们将其附加到末尾。
我在一个有几个像这样的文件的目录上测试了它,它非常有效。 运行 一次使用 -WhatIf,这样您就可以看到会发生什么。如果你喜欢你所看到的,运行 不带 -WhatIf。
像这样使用正则表达式替换怎么样:
Get-ChildItem -Filter "*.jpg" | % {
Rename-Item $_.FullName -NewName ($_.FullName -replace '_by_.*\.jpg$', '')
}
如果正则表达式未找到匹配项,则文件名保持不变。
是否可以使用 PowerShell 删除文件夹中所有文件的文件名结尾?示例:
- moira_by_kr0npr1nz-d8poqdb.jpg
- shining_eye___step_by_step_by_ryky-d8pp6xh.jpg
- redemption___the_hunters_by_danluvisiart-d8oy1ef.jpg
所以我想删除从 "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 参数来更改名称。
我将分解引号内发生的事情:
- 取 Name 并找到单词 'by' 最后一次出现,其中 returns 字符串中的数字位置(索引)
- 使用 SubString 命令 select 从字符串开头到上面的所有内容,从开头到单词 'by' 最后一次出现的所有内容。
- 获取文件的原始扩展名,确保我们将其附加到末尾。
我在一个有几个像这样的文件的目录上测试了它,它非常有效。 运行 一次使用 -WhatIf,这样您就可以看到会发生什么。如果你喜欢你所看到的,运行 不带 -WhatIf。
像这样使用正则表达式替换怎么样:
Get-ChildItem -Filter "*.jpg" | % {
Rename-Item $_.FullName -NewName ($_.FullName -replace '_by_.*\.jpg$', '')
}
如果正则表达式未找到匹配项,则文件名保持不变。