Переименование документов в каталоге с powershell - PullRequest
0 голосов
/ 01 мая 2020

Привет, я пытаюсь переименовать несколько файлов, используя powershell. В настоящее время я использую

Get-ChildItem *.pdf -recurse | Rename-Item -NewName { $_.Name -replace '04282020', '' }

Некоторые примеры имен файлов:

4/30/2020  2:43 PM    101268 04062020MACNN@CN.comNaveLoad 3206078552020-6.pdf
4/30/2020  2:41 PM    Load 3202895372020-04-06T22 00 03+00 00doc882532627.pdf
4/30/2020  3:50 PM    0407202 Load 3206618002020-04-07T14 04 07+00 00doc882732300.pdf

Я хочу переименовать документы в следующем формате:

Load 320607855
Load 320289537
Load 320661800
etc.....

Большинство файлов иметь номера заказов и клиентов на имя. Как я могу удалить весь другой нежелательный текст

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

Вы не очень четко поняли, как можно определить номер заказа по сравнению с другими номерами в именах. Предполагая, что ваши номера заказов всегда следуют за строкой «Load» и всегда имеют длину 9 цифр:

Get-ChildItem *.pdf -recurse | Foreach {
    Rename-Item -NewName ([regex]::matches($_.Name, 'Load \d{9}').value + $_.Extension) -Path $_.Fullname -WhatIf
}

сделает это. Примечание: поскольку мы выбираем определенную строку из полного имени, мы должны добавить расширение к переименованию, иначе оно будет удалено из нового имени файла. Сначала проверьте с параметром -WhatIf и удалите, когда вы довольны результатом.

0 голосов
/ 04 мая 2020

Из ваших комментариев, где вы поместили новые примеры (кстати, вы должны были отредактировать свой вопрос и добавить их туда), я понимаю, вам нужно два разных теста регулярных выражений.

Один из них для имен файлов, которые включают слово Load, а другое - там, где это не так, но вместо этого содержит строку типа 00S308267-RateConfirmation.

. Мне это кажется довольно беспорядочным, но это можно сделать, например, так:

Get-ChildItem -Path 'D:\Test' -Filter '*.pdf' -File -Recurse | 
Rename-Item -NewName {
    switch -Regex ($_.BaseName) {
        'Load\s*\d+'               { '{0}.pdf' -f ($_ -replace '.*(Load\s*\d+)2020-.*', '$1') ; break}
        '\d+S\d+-RateConfirmation' { 'Load {0}.pdf' -f ($_ -replace '.*(S\d+).*', '$1') ; break}
    }
}

До:

D:\TEST
    0407202 Load 3206618002020-04-07T14 04 07+00 00doc882732300.pdf
    04292020rkinnairdspotinc.comRE CAN YOU DO THESE 202029T20 53 58+00 00S308267-RateConfirmation.pdf
    101268 04062020MACNN@CN.comNaveLoad 3206078552020-6.pdf
    Load 3202895372020-04-06T22 00 03+00 00doc882532627.pdf

После:

D:\TEST
    Load 320289537.pdf
    Load 320607855.pdf
    Load 320661800.pdf
    Load S308267.pdf
0 голосов
/ 01 мая 2020

Это кричит о регулярных выражениях! здесь также можно использовать несколько классных групп захвата:

$Files = Get-ChildItem *.pdf -recurse
$Files | Rename-Item -NewName { $_.Name -replace '.*(Load \d{9}).*(\..*)$','$1$2' }

Регулярное выражение:

.*(Load \d{9}).*(\..*)$

.* - Match 0 or more of any character
(  - Start of Capture Group 1 the "Load 123456789"
  Load  - Match "Load "
  \d{9} - Match exactly 9 Digits
)  - End Capture Group 1
.* - Match 0 or more of any character
(  - Start of Capture Group 2 the file extension ".pdf"
  \.    - Match a dot
  .*    - Match 0 or more of any character
)  - End Capture Group 2
$  - End. Make sure that you only match the extension at the end of the string

Затем для замены:

$1$2

$1 - Replace with the first capture group e.g. "Load 123456789"
$2 - Replace with the second capture group e.g. ".pdf"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...