Я исправил твой код, но не думаю, что он делает то, что ты хочешь. $ _ является объектом 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