Powershell, переименуйте каталог после разбора и переключения строк его имени - PullRequest
0 голосов
/ 11 мая 2018

Итак, я пытаюсь переименовать несколько подпапок level1 из чего-то вроде «xy_1234» в «1234_xy».До сих пор мне удалось разделить строки на переменные, создать новое имя-каталога и переименовать каталог, но у меня ничего не получается при попытке автоматизировать процесс в цикле for.Пожалуйста, помогите.

Get-Item $Path | ForEach ( $a, $b = $Path.split('_') | Rename-Item -NewName { $b + ('_') + $a})

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я думаю, что несколько подпапок должны быть пойманы с помощью GCI
перевод "xy_1234" в "1234_xy":

Get-ChildItem $Path -Dir | Where-Object Name -match '^([a-z]+)_(\d+)$' |
    Rename-Item -NewName {$_.Name.Split('_')[1,0] -join ('_')} -WhatIf
0 голосов
/ 11 мая 2018
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
...