通过重新格式化名称中嵌入的日期字符串来重命名文件
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
我在 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
和-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