Как поменять местами несколько имен файлов? - PullRequest
0 голосов
/ 26 апреля 2018

У меня в основном тонна документов, где имена файлов содержат высоту и ширину содержимого. Создатель файлов поместил высоту перед шириной, но я бы хотел, чтобы они поменялись местами . Проблема в том, что схема именования не всегда одинакова. Вот несколько примеров:

(2- или 3-значное число - высота, число + sp - ширина)

123_5sp_abc
99_5sp
abc 123_3sp
abc 123_7sp_def
abc 99_1sp
abc 99_2sp_def
abc_123_4sp
abc_123_6sp_def
abc_99_2sp
abc_99_3sp_def
abc def ghj 99_4sp
abc_def_ghj 99_5sp

То есть единственное, что всегда одинаково, это высота и ширина, соединенные _.

Я придумал разные решения для разных комбинаций. Примерно так:

Get-ChildItem -Path C:\Temp\test|
where -filterscript {$_.BaseName -match '(.*)_(\d{2,3})_(\d.*)_(.*)'}|
Rename-Item -NewName {$matches[1]+'_'+
                      $matches[3]+'_'+
                      $matches[2]+'_'+
                      $matches[4]+$_.Extension}

Ничто из того, что я пробовал, не справилось бы с каждым вариантом

Мой вопрос: есть ли простой способ включить все варианты?

Спасибо за ваши усилия!

1 Ответ

0 голосов
/ 26 апреля 2018
$regex = '([0-9]{2,3})_([0-9]+sp)'

Get-ChildItem -LiteralPath 'C:\Temp\test' |
    Where-Object -FilterScript { $_.BaseName -match $regex } |
    Rename-Item -NewName {
        $_.Name -replace $regex, '$2_$1'
    }

Если sp является частью имени, оно должно быть в регулярном выражении, чтобы оно соответствовало нужным вещам. И вы можете заменить группы совпадений, не перестраивая полное имя вокруг него. Я думаю, что это охватывает все ваши примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...