Powershell Удалить специальные символы из имен файлов

Я ищу способ удалить несколько специальных символов из имен файлов с помощью сценария powershell.

Мои имена файлов выглядят так:

[Доклад]_first_day_of_month_01_(generated_by_powershell)_[repnbr1].txt

Я ломал голову над удалением [] и всего, что между ними, () и всего, что между ними, а также удалением всех _, с желаемым результатом, являющимся именем файла, которое выглядит так:

первый день месяца 01.txt

До сих пор я пробовал приведенное ниже решение безрезультатно. Я запустил каждый из них из каталога, в котором находятся файлы.

Get-ChildItem -Path .\ -Filter *.mkv | %{
$Name = $_.Name
$NewName = $Name -Replace "(\s*)\(.*\)",''
$NewName2 = $NewName -Replace "[\s*]\[.*\]",''
$NewName3 = $NewName2 -Replace "_",' '
Rename-Item -Path $_ -NewName $NewName3
}

Так как это не работает, даже если я пытаюсь сделать один набор за один раз, как это:

Get-ChildItem -Path .\ -Filter *.mkv | %{
$Name = $_.Name
$NewName = $Name -Replace "(\s*)\(.*\)",''
Rename-Item -Path $_ -NewName $NewName
}

Я предполагаю, что в том, как я пытаюсь выполнить эту задачу, есть свойственный недостаток. При этом я бы предпочел использовать командлет Rename-Item, а не решение для перемещения элементов.

1 ответ

Решение
gci *.txt | Rename-Item -NewName {$_ -replace '_*(\[.*?\]|\(.*?\))_*' -replace '_+', ' '}

Переименование является регулярным выражением, которое соответствует [text] или же (text) блокирует и заменяет их ничем. Круглые скобки и скобки нужно экранировать в регулярных выражениях, чтобы буквально соответствовать им. Это соответствует им с дополнительными ведущими или конечными подчеркиваниями, чтобы получить [Report]_ или же _[repnbr1] потому что это оставило бы _ в начале или в конце имени, и они станут пробелами в начале / конце, что раздражает. Затем он заменяет оставшиеся подчеркивания пробелами.

Смотрите здесь регулярное выражение: Regex101

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