1

Я хотел бы знать, возможно ли рекурсивное удаление специальных символов в powershell из всех файлов во всей структуре каталогов?

например, если у меня есть файл с именем:

my presentation (fix).xlsx

Я хотел бы переименовать его в:

my presentation fix.xlsx

спасибо за ваше руководство.

причина, по которой нам нужно это сделать, заключается в том, что мы переносим множество файлов в sharepoint 2010, а sharepoint не нравится файлы со специальными символами!

1 ответ1

1

Следующая команда рекурсивно обходит ваше соответствие структуры каталогов, и для каждого соответствующего файла или каталога выполняет переименование этого файла, заменяя каждый из символов-нарушителей на пустой символ с помощью оператора powershell -replace .

Обратите внимание, что вам нужно будет создать регулярное выражение, которое соответствует всем регулярным символам, которые вы хотите отфильтровать. Чтобы соответствовать приведенному вами примеру и убрать круглые скобки, регулярное выражение будет:

$re = "[()]"

Если вы хотите добавить квадратные скобки, вы должны экранировать их, используя обратную косую черту:

$re = "[\[\]()]"

просто продолжайте добавлять символы между внешними квадратными скобками по мере необходимости:

$re = "[\[\]()!]"

Вот сценарий, обратите внимание на танец, так что оператор -replace действует только на базовую часть имени на каждой итерации:

dir -Recurse | ?{$_.Name -match $re}  | %{ren -literalpath $_.FullName -newname (join-path (get-item $_.PSPArentPath) $($_.Name -replace $re,""))}

Некоторые заметки:

  • Аргумент -LiteralPath в команде ren необходим для возможности замены файлов квадратными скобками: [] он доступен только в Powershell v3 IIRC.
  • После переименования у вас могут возникнуть коллизии имен, этот скрипт не справится с этим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .