我正在尝试整理一些分成许多不同文件夹的旧照片。所有文件夹名称都包含年份,但几乎总是在文件夹名称的末尾。当我试图对过去 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/