powershell - 如何使用 Powershell 重命名文件夹以将年份放在首位

标签 powershell rename

我正在尝试整理一些分成许多不同文件夹的旧照片。所有文件夹名称都包含年份,但几乎总是在文件夹名称的末尾。当我试图对过去 20 年的所有照片进行分类时,这并不是很好。我正在尝试编写一个脚本来遍历所有文件夹名称并将年份 (YYYY) 移动到文件夹名称的开头。

当前文件夹:

  • 2012 年最棒的旅行
  • 2010年探亲
  • 2017年旅行
  • 2001 年的老照片

转换为:

  • 2012 有史以来最好的旅行
  • 2010年探亲
  • 2017年旅行
  • 2001年老照片来自

我对 powershell 不是很熟悉,所以我花了几个小时摆弄正则表达式和必要的脚本来过滤到文件夹名称的正确子集(以字母开头并包含 4 位数字年份)但是我'我正在努力真正成功地重命名这些。

这是我的:

$folders = Get-ChildItem -Path C:\Users\User\pictures\ | Where-Object { $_.Name -match '^[a-zA-Z].+[0-9]{4}' }
foreach ($folder in $folders) 
        { $folder.Name.Split() | Where {$_ -match "[0-9]{4}"}
            Rename-Item -Path $folder-NewName  "$($Matches[0])_$folder.Name"
}

感谢任何帮助!

最佳答案

如果您使用 -match运算符 regex通过捕获组 ((...)) 捕获感兴趣的名称部分,您可以重新排列这些名称部分,如 automatic $Matches variable 中所示变量,在 delay-bind script block 中传递给 Rename-Item 调用:

Get-ChildItem -Directory C:\Users\User\pictures |
  Where-Object Name -match '^(.+?) ?\b(\d{4})\b(.*?)$' |
    Rename-Item -WhatIf -NewName { 
      '{0} {1}{2}' -f $Matches.2, $Matches.1, $Matches.3 
    }

注意:-WhatIf common parameter在上面的命令中预览 操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf

有关正则表达式及其交互能力的解释,请参阅 this regex101.com page .


注意:下面的简化,其中使用了-replace运算符,原则上有效,但不幸的是,从 PowerShell 7.2.1 开始,对于名称不包含 4 位数年份或已经在名称的开头:

# !! Works, but reports spurious errors as of PowerShell 7.2.1
Get-ChildItem -Directory C:\Users\User\pictures
  Rename-Item -WhatIf -NewName { $_.Name -replace '^(.+?) ?\b(\d{4})\b(.*?)$' }

原因是 Rename-Item 在尝试将目录重命名为其现有名称时提示的不幸行为(当 -replace 操作不正确时会发生这种情况)找到一个正则表达式匹配并因此按原样返回输入字符串),这应该是一个安静的无操作,因为它已经用于文件 - 参见GitHub issue #14903 .

关于powershell - 如何使用 Powershell 重命名文件夹以将年份放在首位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70565508/

相关文章:

powershell - 使用管道和直接使用 InputObject 参数之间有什么效率差异吗?

linux - 使用奇怪的 unicode 名称重命名文件

bash - 如何使用 Bash 重命名在前面添加连字符?

ios - 克隆替换我的 iPhone 设备和模拟器上以前的应用程序

c#根据下载请求动态重命名文件

powershell - 如何将图像添加到使用 Nreco PdfGenrator 创建的 PDF

powershell - Azure Service Fabric - 使用 Powershell 配置服务实例参数

powershell - Pushd/popd 和重新启动的问题

android - 如何在仅知道其媒体内容 Uri 的 Android 中重命名文件

c++ - 从头文件 <string> 编译,<stack> 没有给出任何输出