通过重新格式化名称中嵌入的日期字符串来重命名文件

Rename files by reformatting the date string embedded in their names

我在 CMD 中使用 Windows' Powershell 从我的文件名中删除 'Mon, tue, wed' 等,效果很好

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Mon ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Tue ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Wed ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Thur ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Fri ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Sat ", "") }

现在我的文件名如下所示: 2018 年 7 月 13 日 - Lorem ipsum

我想把日期和月份调换,所以会是: 2018 年 7 月 13 日,所以我可以按月排序。或者甚至是 2018 年 7 月 13 日。

我该怎么做?

谢谢, 迈克

您可以对每个月进行链式替换,并以替换语句结束,这样可以切换数字

"13 July 2018 - Lorem ipsum" `
    -replace 'July', '07' `
    -replace 'Aug', '08' `
    -replace "(\d+) (\d+) (\d+)", '  '

到 returns

2018 07 13 - Lorem ipsum

您可以使用以下代码来转换日期

$string = '13 July 2018 - Lorem ipsum'
$dateObject = [datetime]$string.Split('-')[0]
Write-Output "$($dateObject.ToString('yyyy MMMM dd')) - $($array[1])"

这将输出

2018 July 13 -  Lorem ipsum

您可以将两个所需的转换组合成一个单个操作使用Rename-Item in which the -replace operator允许您根据需要根据 regex(正则表达式)转换文件名。

Get-ChildItem -Recurse -Name | Rename-Item -NewName {
  $_.Name -replace '\w+ (\d+) (\w+) (\d+)', '  '
} -WhatIf

-WhatIf 预览重命名操作;删除它以执行实际重命名。

例如,名为 Mon 13 July 2018 - Lorem ipsum 的输入文件将重命名为
2018 July 13 - Lorem ipsum.

注意:此示例文件名恰好没有文件扩展名,但上面和下面的解决方案同样适用于有扩展名的文件名。

有关 PowerShell 的 -replace 运算符的详细信息,请参阅


如果您希望使您的文件名真正可排序 使用嵌入格式(例如 2018-07-13 来表示 13 July 2018,则需要做更多的工作,通过 -split operator:

Get-ChildItem -Recurse -Name | Rename-Item -NewName {
  # Split the name into the date part (ignoring the weekday) and the
  # rest of the file name.
  $null, $date, $rest = $_.Name -split '\w+ (\d+ \w+ \d+)'
  # Convert the date string to [datetime] instance, reformat it, and
  # append the rest.
  ([datetime] $date).ToString('yyyy-MM-dd') + $rest
} -WhatIf

例如,名为 Mon 13 July 2018 - Lorem ipsum 的输入文件将重命名为
2018-07-13 - Lorem ipsum.

有关 PowerShell 的 -split 运算符的详细信息,请参阅
分配给 多个 变量 ($null, $date, $rest = ...) 在帮助主题 about_Assignment_Operators

中有解释

不是你问题的答案,IMO mklement0 的答案是最好的。

但可以替代您的 丑陋 次优示例代码。

基于 RegEx 的替换运算符优于 .replace() 方法
当有交替替换时。

[Globalization.DatetimeFormatInfo]::CurrentInfo.AbbreviatedDayNames

returns 当前语言环境的缩写日期名称,可以组合
在一个正则表达式 "(Sun|Mon|Tue|Wed|Thu|Fri|Sat) " 中使用代码

$RE=[regex]"("+([Globalization.DatetimeFormatInfo]::CurrentInfo.AbbreviatedDayNames -join '|')+") "

Get-ChildItem -recurse -File | Rename-Item -NewName {$_.Name -replace $RE} -WhatIf

空替换字符串不需要用-replace运算符表示。

如果输出看起来没问题,删除尾随的 -WhatIf