微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在寻找一个批处理脚本(recursion)重命名文件文件夹..重命名的例子:34354563.randomname_newname.png to newname.png

我已经挖掘了从string开头到第一个下划线(它的^(.*?)_ )匹配的正则expression式,但不能说服Windows批处理让我复制或使用RegEx重命名

在C中转换转义序列

匹配前的单词和行的grep

简单的C + +正则expression式库VS 2008的W / Ofunction包

从string中提取分辨率

计数在PHP正则expression式模式的话?

从命令行提示 – 没有正则表达式 :

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

路径 none.ext(什么都不做)

Path Some_file_name.ext => file_name.ext

路径 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 /AD *_*.*') DO FOR /F "TOKENS=1*DELims=_" %%B IN ("%%~NA") DO IF "%%~C" NEQ "" ECHO REN "%%~A" "%%~C%%~XA"

看看输出,并删除ECHO如果它看起来不错。

标准的Windows外壳没有正则表达式的能力,事实上它是非常基本的。 但是你可以使用PowerShell来做到这一点。

我不是很熟悉Power Shell,但是这个问题解释了如何过滤文件: 使用powershell来查找匹配两个独立正则表达式的文件

解决方

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

只能用一个下划线重命名文件

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

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

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

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

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

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

原始答复

这可以使用名为REPL.BAT的混合JScript /批处理实用程序来完成,该实用程序执行正则表达式搜索并替换stdin,并将结果写入stdout。 下面的所有解决方案都假定REPL.BAT位于PATH中的某个位置。

我故意把ECHO打开,这样你就可以得到执行重命名命令的日志。 如果遇到名称冲突,这一点尤为重要:两个不同的起始名称都可以折叠成相同的新名称。 只有第一次重命名会成功 – 第二次将失败并显示一条错误消息。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐