【问题标题】:Remove end of filename using PowerShell使用 PowerShell 删除文件名的结尾
【发布时间】:2015-06-20 14:47:29
【问题描述】:
是否可以使用 PowerShell 删除文件夹中所有文件的文件名结尾?例子:
- moira_by_kr0npr1nz-d8poqdb.jpg
- shining_eye___step_by_step_by_ryky-d8pp6xh.jpg
- 赎回___the_hunters_by_danluvisiart-d8oy1ef.jpg
所以我想删除从“by”到“.jpg”的所有内容。
【问题讨论】:
标签:
powershell
filenames
rename
【解决方案1】:
如何像这样使用正则表达式替换:
Get-ChildItem -Filter "*.jpg" | % {
Rename-Item $_.FullName -NewName ($_.FullName -replace '_by_.*\.jpg$', '')
}
如果正则表达式未找到匹配项,则文件名保持不变。
【解决方案2】:
我会使用 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 参数来更改名称。
我将分解那里的引号内发生的事情:
- 获取名称并查找单词“by”最后一次出现的时间,它返回字符串内的数字位置(索引)
- 使用 SubString 命令选择从字符串开头到上面的所有内容,从开头到最后一次出现“by”这个词的所有内容。
- 获取文件的原始扩展名并确保将其附加到末尾。
我在一个包含几个这样的文件的目录上测试了它,它就像一个魅力。使用 -WhatIf 运行一次,这样您就可以看到会发生什么。如果您喜欢您所看到的,请再次运行它而不使用 -WhatIf。
【解决方案3】:
是的,您可以对文件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,在这种情况下不应该做任何事情