Powershell:如何将日期(格式:yyyymmdd)从文件名中的任意位置移动到文件名末尾?

Powershell:如何将日期(格式:yyyymmdd)从文件名中的任意位置移动到文件名末尾?

目前我正在使用

dir | Rename-Item -NewName {$_.name -replace "",""}

重命名目录中的文件。文件名多种多样,需要统一。

文件名示例:

  1. 20211112_CLAM_30001_有关 xyz_DK 的重要信息
  2. CLAM_DK_20201002_30001_PA01 协议 - 电子邮件
  3. DK_30001_客户更新增加_signed_20220102

统一格式:

CLAM_30001_任意文本_yyyymmdd

文件名中的任意位置都有一个 8 位数字的日期。日期必须位于文件名的最末尾。我怎样才能将其移到末尾?(也许是 REGEX?)

答案1

请尝试以下操作:

gci | Where { $_.Name -Match '\d{8}'} | ForEach {
        if ($_.Name -Match '^(\d{8})_(.+)$') { 
            Rename-Item $_ ( $_.Name -Replace  '^(\d{8})_(.+)$','$2_$1' ) }
        elseif ($_.Name -Match '^(.+_)(\d{8})_(.+)$') { 
            Rename-Item $_ ( $_.Name -Replace '^(.+_)(\d{8})_(.+)$', '$1$3_$2' ) }
    }

代码检查文件名中这 8 位数字的位置(开头或其他位置),并相应地重命名文件。无需检查这 8 位数字是否位于末尾。

答案2

您可以不ForEach-Object使用脚本块参数来执行此-NewName操作,只需将子句中捕获的 8 位数字结果移至Where-Object文件 BaseName 的末尾即可。
然后删除所有前导或尾随下划线,并确保新名称中没有重复的下划线。最后附加文件的扩展名(如果有)。

如果文件已经具有所需的名称格式,则不会重命名(无操作)

Get-ChildItem -Path 'X:\ThePath' -File | Where-Object { $_.BaseName -match '(\d{8})' } | 
Rename-Item -NewName { (('{0}_{1}' -f ($_.BaseName -replace $matches[1] ), $matches[1]).Trim("_") -replace '_+', '_') + $_.Extension }

相关内容