[英]Convert date format in file names to yyyy-mm-dd (ISO Format) - Currently in multiple other formats, including yyyy.mm.dd, mm.dd.yyyy, and mm-dd-yyyy
我有一个文件系统,该文件系统的各个文件夹级别的文件名中的日期格式错误。
我正在寻找使用Powershell进行检查并将其更新为正确的日期格式(ISO日期)。
到目前为止,这是我想出的(将yyyy.mm.dd切换为yyyy-mm-dd),但这并不完全正确:
Get-ChildItem -File -Recurse | % { Rename-Item -Path $_.PSPath -NewName $_.Name.replace("201[0-9]\.[0-9][0-9]\.[ -~].","201[0-9]-[0-9][0-9]-[ -~].")}
以下脚本可以成功地将点更改为破折号,但是它将所有点都更改为破折号,并且我要注意不要在第10个字符之后更改任何点,并且仅对符合上述格式的文件(例如201 [0- 9]。[0-9] [0-9]。[0-9] [0-9])。
Get-ChildItem -Path $_.PSPath -Filter "*.pdf" | Rename-Item -NewName { $_.BaseName.Replace(".","-") + $_.Extension }
我知道我已经接近第一个了,但是我还不在那里。 是否有人对更改做出任何建议?
感谢您的帮助。
在处理日期时,建议将其解析为日期时间对象,以便您可以利用内置功能。
由于您使用的是容易转换日期和月份的多种格式,因此建议您使用单独调整的滤镜。 您还可以使用一个开关并匹配基本名称。 编辑:我改写了开关。
您也可以使用-WhatIf
来确认重命名项目正常工作。
Get-ChildItem -path $path -recurse -include *.pdf | Where-Object BaseName -match ".*[\d\.\-]{10}$" | Foreach-Object {
$null = $PSItem.BaseName -match "(.*)([\d\.\-]{10})$"
Switch -regex ($matches[2]){
"\d{4}\-\d{2}\-\d{2}" {$date = [datetime]::ParseExact($matches[2],"yyyy-dd-MM",$null)}
"\d{2}\.\d{2}\.\d{4}" {$date = [datetime]::ParseExact($matches[2],"MM.dd.yyyy",$null)}
"\d{4}\.\d{2}\.\d{2}" {$date = [datetime]::ParseExact($matches[2],"yyyy.dd.MM",$null)}
}
$PSItem | rename-Item -NewName "$(Matches[1]).($date.ToString("yyyy-MM-dd")$($PSItem.Extenstion))"
}
使用正则表达式的另一种方法。 当您确信文件将被正确Rename-Item
,请从Rename-Item
cmdlet中删除-WhatIf
。
Get-ChildItem -Path . -File |
ForEach-Object {
if ($_.Name -match '(.*)(\d{4})\.(\d{2})\.(\d{2})(.*)') {
Rename-Item -Path $_.FullName -NewName $($_.Name -replace '(.*)(\d{4})\.(\d{2})\.(\d{2})(.*)','$1$2-$3-$4$5') -Whatif
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.