Переименование диапазона из файлов с Powershell

Мне помогли с этим вопросом

Переименование диапазона из файлов с Powershell - от первого до третьего с последнего дефиса

и это сработало замечательно, но теперь у меня возникла новая проблема.

Мои имена файлов csv теперь имеют случайное количество дефисов, например:

abc-def-ghi-jkl-mno-pqr-s-tuv-ke-traffic-by-domains-17-Oct-2018_23-49-38-6d73395f476ad09a7506dc00533933b8.csv
abc-def-ghi-jkl-ke-traffic-by-domains-15-Oct-2018_05-20-36-75eabae7c4123198ff5fe6f4f642449f.csv
abc-def-ghi-jkl-mno--ke-traffic-by-domains-12-Oct-2018_06-23-58-b13eb8f362c09fbe405458fac8af8f8e.csv

Количество дефисов меняется от файла к файлу.

Я хотел бы переименовать их с помощью PowerShell в

abc-17-Oct-2018.csv
abc-15-Oct-2018.csv
abc-12-Oct-2018.csv

Я пробовал следующее:

1. Удалите все после "_"

Get-ChildItem -Filter *.csv | Foreach-Object -Process { 
    $NewName = [Regex]::Match($_.Name,"^[^_]*").Value + '.csv'
    $_ | Rename-Item -NewName $NewName
}

2. Удалите все после первого "-" до "ke-traffic-by-domains-"

Get-ChildItem -Filter *.csv | Rename-Item -NewName { 
$word = "-*ke-traffic-by-domains-"
$NewName = $_.Name -split $word + '.csv' 
    $_ | Rename-Item -NewName $NewName
}

Но я застрял на № 2, удаляя диапазон с регулярным выражением.

Может кто-нибудь любезно показать мне способ изменить имена файлов?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
64
1

Ответы 1

Используйте регулярное выражение в соответствии с вашими критериями (см. Regex101.com)

Get-ChildItem *.csv |
  Where-Object Name -match '^([^\-]+)-.*?-traffic-by-domains-(\d{1,2}-\D{3}-20\d{2})_'|
    Rename-Item -NewName {"{0}-{1}.csv" -f $Matches[1],$Matches[2]} -WhatIf

Если результат выглядит нормально, удалите завершающий -WhatIf.

Файлы на моем Ramdrive после запуска сценария с вашими примерами имен csv:

> gci

    Verzeichnis: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-11-05     09:38              0 abc-12-Oct-2018.csv
-a----       2018-11-05     09:38              0 abc-15-Oct-2018.csv
-a----       2018-11-05     09:38              0 abc-17-Oct-2018.csv

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

Akane 02.11.2018 03:12

Может кто-нибудь помочь мне понять этот ответ? Я не уверен, что означает часть «-f $ Matches [1], $ Matches [2]», плюс powershell ничего не делает с этой командой.

Akane 05.11.2018 01:24

Вы удалили -WhatIf после проверки вывода? Я здесь успешно протестировал. Оператор -match заполняет переменную $Matches, доступ к (группам захвата) из REgEx можно получить по индексу - $ Matches [0] является целым RegEx. -f = format operator поясняется здесь

user6811411 05.11.2018 09:47

Другие вопросы по теме