Get-Item $Path | Rename-Item -NewName {
$tokens = $_.Name -split '_' # split the name into tokens
'{0}_{1}' -f $tokens[1], $tokens[0] # output with tokens swapped
} -WhatIf
-WhatIf
предварительный просмотр операции.
Как видите, вы можете выполнить синтаксический анализ как часть блока скрипта, переданного параметру Rename-Item
-NewName
.
Поскольку -NewName
ожидает только новый файл или каталог элемента name (в отличие от полного пути), $_.Name
анализируется и его преобразование (неявно) выводится.
Вот более лаконичная формулировка, вдохновленная подсказкой LotPings :
Get-Item $Path | Rename-Item -NewName { -join ($_.Name -split '(_)')[-1, 1, 0] }
Это зависит от способности PowerShell нарезать массив, указав массив (список) индексов: -1, 1, 0
эффективно переворачивает элементы массива, которые возвращает $_.Name -split '(_)'
- обратите внимание на (...)
вокруг _
, что гарантирует включение экземпляров _
в массив возвращаемых токенов;затем унарная форма оператора -join
объединяет элементы обратного массива.
Примечание: я предполагаю, что $Path
содержит шаблонное выражение, которое соответствует только интересующим каталогам.
Если вам необходимо четко указать только соответствующие каталоги, используйте Get-ChildItem
с переключателем
-Directory
:
Get-ChildItem $Path -Directory
с шаблоном подстановки, специально соответствующим имени образца из вашего вопроса:
Get-ChildItem [a-z][a-z]_[0-9][0-9][0-9][0-9] -Directory