繁体   English   中英

批处理.BAT脚本以重命名文件

[英]Batch .BAT script to rename files

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

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

从命令行提示符-不带

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

在扩展名中避免_

@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

标准的Windows Shell没有正则表达式功能,实际上它是非常基础的。 但是您可以使用powershell来执行此操作。

我对power shell不太熟悉,但是另一个问题说明了如何过滤文件: 使用powershell查找与两个单独的正则表达式匹配的文件

新解决方案

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

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

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

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

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

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

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


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

原始答案

可以使用称为REPL.BAT混合JScript / batch实用程序完成此操作,该实用程序执行regex搜索并在stdin上进行替换,并将结果写入stdout。 以下所有解决方案均假定REPL.BAT在PATH中。

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

我有三种解决方案,它们仅在处理包含多于1个_字符的名称方面有所不同。

此解决方案将仅重命名名称中恰好带有_文件(不考虑扩展名)。 诸如a_b_c_d.txt类的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"

暂无
暂无

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

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