【问题标题】:Rename file 20140914_foo.pdf to 2014-09-14 Sunday.pdf将文件 20140914_foo.pdf 重命名为 2014-09-14 Sunday.pdf
【发布时间】:2014-11-08 09:12:12
【问题描述】:

我有一份报纸目录:

20140914_foo.pdf
20140915_foo.pdf
20140916_foo.pdf

我想将它们重命名为

2014-09-14 Sunday.pdf
2014-09-15 Monday.pdf
2014-09-16 Tuesday.pdf

这两个语句可以解决问题:

Get-ChildItem | Rename-Item -NewName {$_.Name.Insert(4,'-').Insert(7,'-') -replace 'foo', ''}
Get-ChildItem | Rename-Item -NewName {$_.BaseName + ' ' + (get-date($_.BaseName)).DayOfWeek + $_.Extension}

有没有一种优雅的方式在一个语句中做到这一点?

【问题讨论】:

  • 大括号中的表达式是一个脚本块,因此可以包含多个语句。将日期和日期提取到临时变量,建立新名称,然后将其作为字符串返回

标签: file powershell rename


【解决方案1】:

编辑:添加了弗罗德的建议

试试这个,代码会拆分文件名,将日期字符串解析为[datetime]类型并提取其属性以构建所需的名称:

Get-ChildItem | % {
    $date = [datetime]::ParseExact(($_.Name -split "_")[0],"yyyyMMdd",$null)
    $newName = "$($date.ToString("yyyy-MM-dd")) $($date.DayOfWeek).pdf"
    ren $_ $newName
}

【讨论】:

  • 我会使用$newname = "$($date.ToString("yyyy-MM-dd"))_$($date.DayOfWeek).pdf" 来清理脚本块:)
【解决方案2】:

给你 - 一行:

Get-ChildItem | Rename-Item -NewName {$_.Name -replace '(\d{4})(\d{2})(\d{2})_[^.]+(\.\w+)', "`$1-`$2-`$3 $([DateTime]::ParseExact(($_.BaseName -split '_')[0], 'yyyyMMdd',$null).DayOfWeek)`$4"} -WhatIf

What if: Performing the operation "Rename File" on target "Item: C:\Users\Keith\20140914_foo.pdf
Destination: C:\Users\Keith\2014-09-14 Sunday.pdf".
What if: Performing the operation "Rename File" on target "Item: C:\Users\Keith\20140915_foo.pdf 
Destination: C:\Users\Keith\2014-09-15 Monday.pdf".
What if: Performing the operation "Rename File" on target "Item: C:\Users\Keith\20140916_foo.pdf
Destination: C:\Users\Keith\2014-09-16 Tuesday.pdf".

删除-WhatIf 以进行实际重命名。上面的方法使用捕获组从文件名中捕获年、月、日和扩展名。然后它将年、月、日的捕获组解析为 DateTime 对象,以便我们可以获取星期几。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2017-12-12
    • 2016-09-23
    相关资源
    最近更新 更多