Мне помогли с этим вопросом
Переименование диапазона из файлов с 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, удаляя диапазон с регулярным выражением.
Может кто-нибудь любезно показать мне способ изменить имена файлов?
Используйте регулярное выражение в соответствии с вашими критериями (см. 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
Может кто-нибудь помочь мне понять этот ответ? Я не уверен, что означает часть «-f $ Matches [1], $ Matches [2]», плюс powershell ничего не делает с этой командой.
Вы удалили -WhatIf
после проверки вывода? Я здесь успешно протестировал. Оператор -match
заполняет переменную $Matches
, доступ к (группам захвата) из REgEx можно получить по индексу - $ Matches [0] является целым RegEx. -f = format operator
поясняется здесь
Спасибо, я только начал изучать регулярные выражения, и это очень помогло. Однако ваш ответ, кажется, не меняется, даже когда я удаляю -WhatIf.