批量.BAT脚本重命名文件

时间:2013-09-19 07:49:56

标签: regex windows batch-file

我正在寻找批处理脚本(递归地)重命名文件的文件夹.. 重命名示例:        34354563.randomname_newname.png到newname.png

我已经挖出了RegEx以便从字符串的开头到第一个下划线(它的^(.*?)_)进行匹配,但是不能说服Windows Batch让我使用RegEx复制或重命名。

4 个答案:

答案 0 :(得分:3)

从命令行提示符 - 没有

FOR /R %f IN (*.*) DO FOR /F "DELIMS=_ TOKENS=1,*" %m IN ("%~nxf") DO @IF NOT "%n" == "" REN "%f" "%n"

在批处理文件中,加倍%:

FOR /R %%f IN (*.*) DO FOR /F "DELIMS=_ TOKENS=1,*" %%m IN ("%%~nxf") DO @IF NOT "%%n" == "" REN "%%f" "%%n"

编辑:发布以下案例的新纯批处理解决方案:

  • Path \ File_name.ext => name.ext
  • Path \ none.ext(什么都不做)
  • 路径\ Some_file_name.ext => file_name.ext
  • Path \ name.some_ext(什么都不做)
  • 路径\ Some_file_name.some_ext => name.some_ext

批处理(删除ECHO以使其正常运行):

FOR /R %%f IN (*.*) DO CALL :UseLast "%%~f" "%%~nf"

GOTO :EOF

:UseLast
FOR /F "DELIMS=_ TOKENS=1,*" %%m IN (%2) DO IF "%%n"=="" (
    IF NOT "%~2"=="%~n1" ECHO REN %1 "%~2%~x1"
) ELSE CALL :UseLast %1 "%%n"
GOTO :EOF

答案 1 :(得分:3)

在扩展程序中避免_

@ECHO OFF 
FOR /F "DELIMS=" %%A IN ('DIR /S /B /A-D *_*.*') DO FOR /F "TOKENS=1*DELIMS=_" %%B IN ("%%~NA") DO IF "%%~C" NEQ "" ECHO REN "%%~A" "%%~C%%~XA"

查看输出,如果看起来不错,请删除ECHO

答案 2 :(得分:0)

标准的Windows shell没有正则表达式功能,实际上它非常基础。但你可以使用powershell来做到这一点。

我对power shell不太熟悉,但另一个问题解释了如何过滤文件:Using powershell to find files that match two seperate regular expressions

答案 3 :(得分:0)

新解决方案

使用JREN.BAT这是一个非常简单的解决方案,我的新混合JScript /批处理命令行实用程序通过正则表达式搜索和替换来重命名文件和文件夹。

仅重命名带有下划线的文件:

jren "^[^_]+_([^_]+\.png)$" "$1" /s /i

保留第一个下划线后的所有内容:

jren "^.*?_" "" /s /fm "*.png"

保留最后一个下划线后的所有内容:

jren "^.*_" "" /s /fm "*.png"


=========================================== ==============

原始答案

这可以使用执行正则表达式搜索的hybrid JScript/batch utility called REPL.BAT并在stdin上替换并将结果写入stdout来完成。以下所有解决方案都假定REPL.BAT位于PATH中。

我故意将ECHO置于ON状态,以便获取已执行的重命名命令的日志。如果您发生名称冲突,这一点尤其重要:两个不同的起始名称都可以折叠为相同的新名称。只有第一次重命名才会成功 - 第二次重命名将失败并显示错误消息。

我有三个解决方案,区别在于它们如何处理包含多个_字符的名称。

此解决方案仅重命名名称中只有一个_的文件(忽略扩展名)。像a_b_c_d.txt这样的名称将被忽略。

@echo on&@for /f "tokens=1,2 delims=*" %%A in (
  '2^>nul dir /b /s /a-d *_* ^| repl ".*\\[^_\\]*_([^_\\]*\.[^.\\]*)$" "$&*$1" a'
) do ren "%%A" "%%B"

下一个解决方案将在最后_之后保留名称。像a_b_c_d.txt这样的名称将变为d.txt

@echo on&@for /f "tokens=1,2 delims=*" %%A in (
  '2^>nul dir /b /s /a-d *_* ^| repl ".*_([^\\_.]*\.[^.\\]*)$" "$&*$1" a'
) do echo ren "%%A" "%%B"

最后一个解决方案将在第一个_之后保留名称。像a_b_c_d.txt这样的名称将变为b_c_d.txt。这应该与Endoro答案给出相同的结果。

@echo on&@for /f "tokens=1,2 delims=*" %%A in (
  '2^>nul dir /b /s /a-d *_* ^| repl ".*\\[^\\]*?_([^\\]*\.[^.\\]*)$" "$&*$1" a'
) do echo ren "%%A" "%%B"