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