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

问题描述:

我并没有真正搞乱批处理文件,但考虑到我们的工作环境,这是我们唯一的解决方案。使用批处理和正则表达式重命名文件

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

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

,我们需要去掉最后一位数字设定和下面连字符,使他们念想:

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

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

任何帮助,非常感谢。

你可以使用这个有些怪异的技巧:

@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:.=-! 
    ) 
) 

也就是说,通过.改变-和使用两个嵌套F​​OR命令来消除最后两个扩展。然后,重新组合的剩余名称与原来的扩展和hypens变回点:

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

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

+2在DOS中隐藏和双重嵌套FOR循环:-) – mnemotronic 2015-07-26 16:07:43

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

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

上述正则表达式将匹配数加只有当它的随后的零个或多个非数字字符以下-符号和线锚定件的端部。

Regex Demo

+0

'rename'是Linux的可爱,但它没有cygwin的或的GnuWin32不是包含在Windows。 'batch-file'标签用于Windows批处理脚本。不过,我不能错误地提出你的建议。我经常ssh到我的linux系统,所以我可以通过autofs回到我的Windows文件系统,并使用Linux'rename'工具。我从来没有运气过cygwin版本。 – rojo 2014-12-05 19:34:53

+0

是的,如果我们使用Linux。但不是。 :(正则表达式很容易。 – zedkineece 2014-12-10 15:15:04

对不起,没有正则表达式

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命令。