Переименовать элемент с помощью SubString / lastIndexOf - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь переименовать около 500 файлов в одном каталоге. Каждый файл имеет формат .docx, аналогичный приведенному ниже.

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

et c.

Я хочу удалить последние две / три цифры перед «.», Включая « _ 'так что я получаю

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 в этом случае не существует.

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 января 2020

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

Вы можете сначала разделить 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...