目前我正在使用
dir | Rename-Item -NewName {$_.name -replace "",""}
重命名目录中的文件。文件名多种多样,需要统一。
文件名示例:
- 20211112_CLAM_30001_有关 xyz_DK 的重要信息
- CLAM_DK_20201002_30001_PA01 协议 - 电子邮件
- DK_30001_客户更新增加_signed_20220102
统一格式:
CLAM_30001_任意文本_yyyymmdd
文件名中的任意位置都有一个 8 位数字的日期。日期必须位于文件名的最末尾。我怎样才能将其移到末尾?(也许是 REGEX?)
答案1
请尝试以下操作:
gci | Where { $_.Name -Match '\d{8}'} | ForEach {
if ($_.Name -Match '^(\d{8})_(.+)$') {
Rename-Item $_ ( $_.Name -Replace '^(\d{8})_(.+)$','$2_$1' ) }
elseif ($_.Name -Match '^(.+_)(\d{8})_(.+)$') {
Rename-Item $_ ( $_.Name -Replace '^(.+_)(\d{8})_(.+)$', '$1$3_$2' ) }
}
代码检查文件名中这 8 位数字的位置(开头或其他位置),并相应地重命名文件。无需检查这 8 位数字是否位于末尾。
答案2
您可以不ForEach-Object
使用脚本块参数来执行此-NewName
操作,只需将子句中捕获的 8 位数字结果移至Where-Object
文件 BaseName 的末尾即可。
然后删除所有前导或尾随下划线,并确保新名称中没有重复的下划线。最后附加文件的扩展名(如果有)。
如果文件已经具有所需的名称格式,则不会重命名(无操作)
Get-ChildItem -Path 'X:\ThePath' -File | Where-Object { $_.BaseName -match '(\d{8})' } |
Rename-Item -NewName { (('{0}_{1}' -f ($_.BaseName -replace $matches[1] ), $matches[1]).Trim("_") -replace '_+', '_') + $_.Extension }