1

我有一个包含以时间戳命名的媒体文件的文件夹,如下所示yyyyMMdd_HHmmss_*.*。我需要将它们重命名为yyyy-MM-dd HH-mm-ss *.*

例如,我需要将文件重命名20181019_210353_BURST2.jpg2018-10-19 21-03-53 BURST2.jpg There is a my丑陋的方法

PS E:> gci | Rename-Item -NewName { $_.Name.Substring(0,4) + '-' + $_.Name.Substring(4,2) + '-' + $_.Name.Substring(6,2) + ' ' + $_.Name.Substring(9,2) + '-' + $_.Name.Substring(11,2) + '-' + $_.Name.Substring(13,2) + $_.Name.Substring(15) }

获得我的目的的正确命令是什么?

4

2 回答 2

6

如果您正在寻找简洁,您可以将-replace运算符与以下正则表达式一起使用:

Get-ChildItem -File -Filter *.jpg | Rename-Item -NewName { 
  $_.Name -replace '(^\d{2})?(\d{2})(\d{2})(\d{2})_', '$1$2-$3-$4 '
} -WhatIf

注意:上面命令中的-WhatIf常用参数是预览操作。-WhatIf 一旦您确定该操作将执行您想要的操作,请删除。

可以在这个 regex101.com 页面上找到对正则表达式的解释,以及对其进行试验的能力和替换表达式。

于 2021-09-13T02:57:54.620 回答
4

您的方法将起作用,但您需要-PathRename-Item. 简短的回答是,需要将字符串分解为要在新名称中使用的组件。

如果你想获得一些正则表达式的乐趣,你可以使用这样的东西。当您确信文件将被正确重命名时,请-WhatIfRename-Item命令中删除 。

Get-ChildItem |
    ForEach-Object {
        if ($_.Name -match '^(....)(..)(..)_(..)(..)(..)(.*)') {
            $NewName = "$($Matches[1..3] -join '-') $($Matches[4..6] -join '-')$($Matches[7])"
            Rename-Item -Path $_.FullName -NewName $NewName -WhatIf
        }
    }
于 2021-09-13T02:28:23.180 回答