繁体   English   中英

使用过滤器批量重命名部分文件名以识别具有设置前缀的文件

[英]Batch renaming part of filenames using filter to identify files with set prefix

我有一系列带有我想删除的前缀的图像文件。 我将拥有的文件名示例:

  • Image_2022-06-09-12-29-00_Filename-01
  • Image_2022-07-09-13-29-59_Filename-02
  • Image_2022-02-11-09-26-31_Filename-03

我希望他们变成:

  • 文件名-01
  • 文件名-02
  • 文件名-03

我目前有一个 .bat 文件,它可以删除所有文件的第一部分,这些文件可以是 .jpg 或 .png 文件:

set current_dir=%cd%
powershell -Command "get-childitem *.png | rename-item -newname { [string]($_.name).substring(26) }"
powershell -Command "get-childitem *.jpg | rename-item -newname { [string]($_.name).substring(26) }"

然而,我现在的问题是,一旦我运行它并重命名了文件,我就无法复制新文件并再次运行 .bat 文件,因为它会重命名已经重命名的文件。 是否可以识别文件名第一部分的序列,然后仅将其应用于这些文件? 前 26 个字符将始终采用该格式,但数字可能会发生变化。

这个简单的纯批处理文件应该可以完成工作(并且应该比 PS 版本运行得快得多):

@echo off

for /F "delims=" %%a in ('dir /B *.png *.jpg') do for /F "tokens=3 delims=_" %%f in ("%%a") do ren %%a %%f

编辑 2022/06/22:满足规范的新方法

@echo off

for /F "delims=" %%a in ('dir /B *.png *.jpg') do for /F "tokens=2* delims=_" %%e in ("%%a") do ren %%a %%f

在我看来,您所要做的就是将文件的 BaseName (不带扩展名的名称)拆分为下划线并取最后一个元素。 然后将它与文件的扩展名重新组合,你就可以开始了。

(Get-ChildItem -Path 'X:\WhereTheFilesAre' -File | Where-Object { $_.Extension -match '\.(jpg|png)' }) | 
Rename-Item -NewName {'{0}{1}' -f ($_.BaseName -split '_')[-1], $_.Extension }

根据您的评论,文件名可能混合了连字符和下划线,您可以将 Rename-Item 脚本块更改为

Rename-Item -NewName {'{0}{1}' -f ($_.BaseName  -replace '.*[-_](\w+[-_]\d+)$', '$1'), $_.Extension }

测试:

'Image_2022-06-09-12-29-00_Filename-01' -replace '.*[-_](\w+[-_]\d+)$', '$1' # --> Filename-01
'Image_2022-07-09-13-29-59_Filename_02' -replace '.*[-_](\w+[-_]\d+)$', '$1' # --> Filename_02

至于将PowerShell函数设置为使用与批处理文件相同的当前目录,请阅读此答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM