首页 > 解决方案 > 在 Powershell 中替换文件名的一部分

问题描述

我有看起来像这样的文件:

2020-0517-example.pdf

2020-0412-example.pdf

2020-0607-example.pdf

我想将文件重命名为:

2020-0723-example.pdf

2020-0723-example.pdf

2020-0723-example.pdf

我基本上会将日期替换为今天的日期,同时保留年份和后缀。

标签: powershell

解决方案


如果您想添加一些完整性检查以确保您正在处理日期,您可以使用模式匹配,然后重命名部分日期:

$date = Get-Date -Format MMdd
Get-ChildItem -Path <filepath> -File |
    Where Basename -match '^(?:19|20)\d\d-(?:0[1-9]|1[012])\d\d-' |
        Rename-Item -NewName { $_.Name -replace '(?<=^\d{4}-)\d{4}',$date } -whatif

或者,您可以先解析日期字符串以使用以下方法进行验证TryParseExact

$date = Get-Date -Format MMdd
Get-ChildItem -Path <filepath> -File |
    Where Name -match '^\d{4}-\d{4}-' | Foreach-Object {
        if ([datetime]::TryParseExact($_.Name.Substring(0,9),'yyyy-MMdd',[System.Globalization.CultureInfo]::InvariantCulture,[System.Globalization.DateTimeStyles]::None,[ref]0)) {
            $FileParts = $_.Name -split '-',3
            Rename-Item -Path $_ -NewName ($FileParts[0],$date,$FileParts[2] -join '-') -WhatIf
       }
    }

您需要删除-WhatIf参数才能完成重命名操作。

解释:

使用-split '-',3,我们确保我们只剩下不超过三个数组元素。这为将文件名重新组合在一起提供了可预测数量的索引。[0]将是一年。[1]将是月日。[2]将是文件名的其余部分。

-replace有关和正则表达式的详细信息,请参阅以下-match内容:

正则表达式-匹配

正则表达式 - 替换


推荐阅读