繁体   English   中英

将文件名中的日期格式转换为yyyy-mm-dd(ISO格式)-当前采用多种其他格式,包括yyyy.mm.dd,mm.dd.yyyy和mm-dd-yyyy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM