我正在尝试整理一些被分散在许多不同文件夹中的旧照片。所有文件夹名称都包含年份,但几乎总是在文件夹名称的末尾。当我试图对过去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"
}
非常感谢您的帮助!
[...]
中的\1
是指具有代码点1
的 Unicode 字符。鉴于这样的控制字符不太可能成为输入字符串的一部分,[^\1]
实际上等同于.
。 - mklement0[^\1]
带有捕获组意味着 _"匹配任何不是捕获组 1 的内容"_。这里还有一个例子:https://regex101.com/r/BzBAlg/1 - Santiago Squarzon\1
在[...]
之外是一个反向引用(仅在所引用的捕获组出现在引用之前时才起作用)。在[...]
中,它是一个八进制转义序列,通过其代码点编码一个字符;尝试[char] 27 -match '[\33]'
。要 否定 反向引用,请使用负向先行断言;例如:'aa', 'ab' | % { $_ -match '^(a)(?!\1)' }
。 - mklement0