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

时间:2019-03-15 12:13:10

标签: powershell replace file-rename

我正在CMD中使用Windows的Powershell从文件名中删除“星期一,星期二,星期三”等,效果很好

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日。

我该怎么办?

谢谢, 迈克

4 个答案:

答案 0 :(得分:2)

您可以将{{1}和带有delay-bind script block-replace operator结合使用,将两个所需的转换组合为单个操作基于 regex (正则表达式)根据需要转换文件名。

Rename-Item

Get-ChildItem -Recurse -Name | Rename-Item -NewName { $_.Name -replace '\w+ (\d+) (\w+) (\d+)', '$3 $2 $1' } -WhatIf 预览重命名操作;删除它以执行实际的重命名。

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

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

有关PowerShell的2018 July 13 - Lorem ipsum运算符的详细信息,请参阅this answer


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

13 July 2018

例如,名为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

有关PowerShell的2018-07-13 - Lorem ipsum运算符的更多信息,请参见this answer
帮助主题about_Assignment_Operators

中说明了分配给多个变量(-split

答案 1 :(得分:1)

不是您的问题的答案,IMO mklement0的答案最有效。

但是可以替代您的 ugly 次优示例代码。

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

[Globalization.DatetimeFormatInfo]::CurrentInfo.AbbreviatedDayNames

返回当前语言环境的缩写日期名称,可以将其组合
在一个带有代码的RegEx "(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

答案 2 :(得分:0)

您可以将每个月的替换链接起来,并以replace语句结尾以切换数字

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

返回三明治

2018 07 13 - Lorem ipsum

答案 3 :(得分:0)

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

$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