使用批处理和正则表达式重命名文件

时间:2014-12-05 16:00:20

标签: regex batch-file file-rename

我还没有真正搞乱批处理文件,但鉴于我们的工作环境,这是我们唯一的解决方案。

我们有一堆文件格式如下:

ICN-A10-C-232101-H-8X662-00001-A-05-U
ICN-A10-C-232101-H-8X662-00002-A-01-U
ICN-A10-C-232101-H-8X662-00003-A-00-U
ICN-A10-C-232101-H-8X662-00004-A-92-U

我们需要删除最后一个数字集并跟随连字符,所以他们读取如下:

ICN-A10-C-232101-H-8X662-00001-A-U
ICN-A10-C-232101-H-8X662-00002-A-U
ICN-A10-C-232101-H-8X662-00003-A-U
ICN-A10-C-232101-H-8X662-00004-A-U

同样,* .bat文件看起来是我们唯一的解决方案。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

抱歉,没有正则表达式

for /f "tokens=1-11 delims=-" %%a in ('
    dir /b /a-d *
') do if "%%k"=="" if not "%%j"=="" (
  echo ren "%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%i-%%j" "%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%j"
)

重命名操作仅回显给控制台。如果输出正确,请删除echo命令。

答案 1 :(得分:1)

您可以使用这个有点奇怪的技巧:

@echo off
setlocal enabledelayedexpansion

cd files
for %%a in (*) do (
   set "name=%%a"
   for %%b in ("!name:-=.!") do for %%c in ("%%~Nb") do (
      set "newName=%%~Nc%%~Xb"
      ECHO ren %%a !newName:.=-!
   )
)

也就是说,通过-更改.并使用两个嵌套的FOR命令来消除最后两个扩展。然后,使用原始扩展名重新组合剩余的名称,并通过夸大更改点:

C:\> dir /B files
ICN-A10-C-232101-H-8X662-00003-A-00-U
ICN-A10-C-232101-H-8X662-00002-A-01-U
ICN-A10-C-232101-H-8X662-00001-A-05-U
ICN-A10-C-232101-H-8X662-00004-A-92-U

C:\> test
ren ICN-A10-C-232101-H-8X662-00003-A-00-U ICN-A10-C-232101-H-8X662-00003-A-U
ren ICN-A10-C-232101-H-8X662-00002-A-01-U ICN-A10-C-232101-H-8X662-00002-A-U
ren ICN-A10-C-232101-H-8X662-00001-A-05-U ICN-A10-C-232101-H-8X662-00001-A-U
ren ICN-A10-C-232101-H-8X662-00004-A-92-U ICN-A10-C-232101-H-8X662-00004-A-U

答案 2 :(得分:0)

您可以在要重命名的文件所在的目录上使用rename命令。

rename 's/\d+-(?=\D*$)//' *

上面的正则表达式只会匹配数字加上以下-符号,只要它后跟零个或多个非数字字符以及行锚点的结尾。

Regex Demo