Как заменить несколько символов (<3) всех имен файлов в папке (и подпапке) с помощью PowerShell - PullRequest
2 голосов
/ 09 июня 2019

Я пытаюсь использовать PowerShell, чтобы установить условие, что если имя файла содержит любой из следующих символов (#, %, &. +. {, }, ~),затем замените эти символы на «_».Я хочу применить это ко всем именам файлов и папок (включая файлы в подпапках).

У меня есть код ниже, который частично работает, так как он работает только для замены 2 символов "(%, &)",Если я хочу заменить больше символов, это не сработает.Появляется сообщение об ошибке, и только первый символ заканчивается заменой.Есть ли способ исправить этот код?

Get-ChildItem -Recurse | `
   Where-Object {$_.Name -match '&' -or $_.Name -match '%' } | `
     Rename-Item -NewName { $_.Name -replace '&','_' -replace '%','_' }

Поскольку у меня нет опыта в кодировании, я был бы очень признателен, если бы вы предоставили весь код, который решит эту проблему, спасибо!

1 Ответ

4 голосов
/ 09 июня 2019

Используйте регулярное выражение класс / набор символов ([...]) для соответствия всем интересующим символам:

Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace '[#%&+{}~]', '_' }

Обратите внимание, что я исключил вызов Where-Object, потому что нет необходимости предварительно фильтровать файлы:
-replace возвращает исходную строку, если регулярное выражение не совпадает, и Rename-Item не работает, если аргумент -NewName совпадает с именем существующего файла.

Кроме того, если вы заканчиваете строку с |, вам также не нужно `, чтобы сигнализировать о продолжении линии.

...