Добавьте круглые скобки около 4 цифр в названии папки - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть около 1500 папок, где последние 4 цифры представляют год.Мне нужно добавить круглые скобки в течение года, сохраняя при этом остальную часть названия.Длина имен папок варьируется от 4 до 20 символов. Некоторые из имен папок содержат номера, отличные от даты.

Я нашел способ поставить круглые скобки в конце имени папки.А также способ добавить круглые скобки в определенном месте от начала имени.Но, похоже, не могу найти способ отсчета от конца имени.

Get-ChildItem -Directory | Rename-Item -NewName {$_.Name -replace '^' ,")"}

Get-ChildItem -Directory  | % { $_ | Rename-Item -NewName ($_.Name -replace '^([\S\s]{5})', '$1(')}

Я бы хотел взять такие папки:

Short.1990
Long.Folder.name.2019
Folder.1.1998

И закончить именами папоккак это:

Short.(1990)
Long.Folder.name.(2019)
Folder.1.(1998)

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Конечный .year фактически является расширением, которое вы можете заменить:

Один вкладыш:

gci -dir|?{$_.Extension -match '^\.(\d{4})$'}|Ren -New {$_.Name -replace $_.Extension,(".({0})" -f $Matches[1])} -WhatIf

Как более подробный скрипт:

Get-ChildItem -Directory | Where-Object {$_.Extension -match '^\.(\d{4})$'} |
    Rename-Item -Newname {$_.Name -replace $_.Extension,(".({0})" -f $Matches[1])} -WhatIf

Пример вывода (немецкий язык):

WhatIf: Ausführen des Vorgangs "Verzeichnis umbenennen" für das Ziel "Element: A:\Folder.1.1998 Ziel: A:\Folder.1.(1998)".
WhatIf: Ausführen des Vorgangs "Verzeichnis umbenennen" für das Ziel "Element: A:\Long.Folder.name.2019 Ziel: A:\Long.Folder.name.(2019)".
WhatIf: Ausführen des Vorgangs "Verzeichnis umbenennen" für das Ziel "Element: A:\Short.1990 Ziel: A:\Short.(1990)".
0 голосов
/ 08 февраля 2019

Может быть, даже не нужно использовать регулярные выражения, а просто следующее ... Это в том случае, если все папки содержат точку и заканчиваются годом!

$folders = Get-ChildItem "Path to you Share holding all your subfolders"
foreach($folder in $folders){
    try{
        $splitYear = $folder.Name.Split(".")[-1]
        $newName = $folder.Name.Replace($splitYear,"($splitYear)")
        Rename-Item -Path $folder.FullName -NewName $newName
        Write-Host "Changed name $($folder.name) to new name $newName" -ForegroundColor Green
    }catch{
        Write-Host "Couldn't change folder $($folder.Name), because $($_.Exception.Message)" -ForegroundColor Red
    }
}
0 голосов
/ 08 февраля 2019

Попробуйте выполнить следующую -replace операцию:

PS> 'Short.1990', 'Long.Folder.name.2019' -replace '\.(\d{4})$', '.($1)'
Short.(1990)
Long.Folder.name.(2019)

В контексте вашей команды:

Get-ChildItem -Directory |
  Rename-Item -NewName { $_.Name -replace '\.(\d{4})$', '.($1)' } -WhatIf

Объяснение из ... -replace '\.(\d{4})$', '.($1)':

  • Regex \.(\d{4})$ соответствует литералу . (с экранированием \.), за которым следуют 4 цифры (\d{4}) в конце ($)вход (имя файла).

    • Включение \d{4} в (...) создает группу захвата , которая захватывает определенные совпадающие цифры, поэтому их можно называть в операнде замены как $1 (значение 1-й группы захвата).
  • Выражение замены '.($1)' заменяет то, что регулярное выражение в целом соответствует литералу ., за которым следует захваченная последовательность из 4 цифр ($1) заключено в буквальное значение (...).

  • Полный обзор оператора -replace см. в этом ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...