我正在寻找一个批处理脚本来(递归地)重命名一个文件夹。重命名示例:34354563.randomname_newname.png 到 newname.png
我已经挖掘了正则表达式以匹配从字符串的开头到第一个下划线(它的^(.*?)_
),但不能说服 Windows Batch 让我使用正则表达式进行复制或重命名。
我正在寻找一个批处理脚本来(递归地)重命名一个文件夹。重命名示例:34354563.randomname_newname.png 到 newname.png
我已经挖掘了正则表达式以匹配从字符串的开头到第一个下划线(它的^(.*?)_
),但不能说服 Windows Batch 让我使用正则表达式进行复制或重命名。
从命令行提示符 - 没有正则表达式:
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"
编辑:一个新的纯批处理解决方案发出以下情况:
批处理(删除 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 查找匹配两个单独的正则表达式的文件
新解决方案
使用JREN.BAT有一个非常简单的解决方案,这是我新的混合 JScript/批处理命令行实用程序,用于通过正则表达式搜索和替换重命名文件和文件夹。
只用一个下划线重命名文件:
jren "^[^_]+_([^_]+\.png)$" "$1" /s /i
保留第一个下划线之后的所有内容:
jren "^.*?_" "" /s /fm "*.png"
保留最后一个下划线之后的所有内容:
jren "^.*_" "" /s /fm "*.png"
==================================================== =======
原始答案
这可以使用名为 REPL.BAT 的混合 JScript/批处理实用程序来完成,该实用程序在标准输入上执行正则表达式搜索和替换,并将结果写入标准输出。以下所有解决方案都假定 REPL.BAT 在您的 PATH 中的某个位置。
我故意将 ECHO 设置为 ON,以便您获得执行的重命名命令的日志。如果您遇到名称冲突,这一点尤其重要:两个不同的起始名称都可能合并为相同的新名称。只有第一次重命名会成功 - 第二次将失败并显示错误消息。
我有三种解决方案,它们仅在处理包含超过 1 个_
字符的名称方面有所不同。
此解决方案只会重命名名称中只有一个_
的文件(忽略扩展名)。likea_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"