具有SubString / lastIndexOf的重命名项

问题描述 投票:1回答:2

我正在尝试在一个目录中重命名大约500个文件。每个文件都是.docx格式,类似于以下格式。

Apartment_7-9_01_92.docx
Apartment_7-9_02_192.docx

我想删除'。'之前的最后两位/三位数,包括'_,以便最后得到

Apartment_7-9_01.docx
Apartment_7-9_02.docx

从未真正使用过Powershell,到目前为止,我所做的研究使我想到了以下内容:

Get-ChildItem -File | ForEach-Object { $_ | Rename-Item -NewName -Replace $_.Name.SubString(0, $_.lastIndexOf('_')),".docx"}

我以为这会占用所有内容,包括最后一个'_'之后的所有内容,并用'.docx'替换,但是这告诉我在这种情况下,lastIndexOf方法不存在。

谢谢

powershell
2个回答
1
投票

您可以先在BaseName上分割"_",然后取出除最后一项以外的所有项目,然后在"_"上重新加入。一种简单的方法是使用$array[0..($array.Length - 2)]。您也可以只执行$array[0..2]以获取前3个项目。然后,您可以在末尾添加Extension。在这里,您可以简单地将FullName重命名为Rename-Item

$Path = "PATH/TO/FILES"

Get-ChildItem -Path $Path -File | ForEach-Object {
    $items = $_.BaseName -split "_"
    $newFileName = ($items[0..($items.Length - 2)] -join "_") + $_.Extension
    Rename-Item -Path $_.FullName -NewName $newFileName
}

2
投票

我修复了您的代码,但我认为它不能满足您的要求。 $ _是一个fileinfo对象,$ _。name是一个字符串,.lastindexof()是一个字符串方法。我认为您想在最后一个“ _”之后而不是之前替换子字符串位置。

Get-ChildItem -File | ForEach-Object { $_ | Rename-Item -NewName (
$_.name -Replace $_.Name.SubString(0, $_.Name.lastIndexOf('_')),".docx") -whatif}

What if: Performing the operation "Rename File" on target "Item:
 /Users/js/Apartment_7-9_01_92.docx Destination: /Users/js/.docx_92.docx".
What if: Performing the operation "Rename File" on target "Item:
 /Users/js/Apartment_7-9_02_192.docx Destination: /Users/js/.docx_192.docx".

这似乎可行,并且接近您的尝试。只需指定子字符串的开始位置即可。

Get-ChildItem -File | ForEach-Object { $_ | Rename-Item -NewName (
$_.name -Replace $_.Name.SubString($_.Name.lastIndexOf('_')),".docx") -whatif}

What if: Performing the operation "Rename File" on target "Item:
 /Users/js/Apartment_7-9_01_92.docx Destination:
 /Users/js/Apartment_7-9_01.docx".
What if: Performing the operation "Rename File" on target "Item:
 /Users/js/Apartment_7-9_02_192.docx Destination:
 /Users/js/Apartment_7-9_02.docx".

也有一种直接通过管道传递给重命名项目的方法,例如在文档中:

Get-ChildItem -File | Rename-Item -NewName {
$_.name -Replace $_.Name.SubString($_.Name.lastIndexOf('_')),".docx"} -whatif
© www.soinside.com 2019 - 2024. All rights reserved.