在文件夹名称中添加约4位数年的括号

时间:2019-02-07 21:16:11

标签: powershell

我大约有1,500个文件夹,后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 :(得分:2)

尝试以下-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)'

  • 正则表达式\.(\d{4})$匹配文字.(转义为\.),并在末尾(\d{4}后跟4位数字($) )的输入(文件名)。

    • \d{4}括在(...)中会创建一个捕获组来捕获匹配的特定数字,因此可以在替换操作数中将它们称为$1(第一个捕获组的值)。
  • 替换表达式'.($1)'将正则表达式整体匹配的内容替换为文字.,后跟捕获在文字{{1}中的4位数字序列($1) }。

  • 有关(...)运算符的全面概述,请参见this answer

答案 1 :(得分:1)

结尾的.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)".

答案 2 :(得分:0)

也许甚至不需要使用正则表达式,而只需使用以下内容即可。如果万一所有文件夹都包含点并且以年末结尾!

$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
    }
}