如何使用批处理删除多个文件中的某些字符后的字符串?

时间:2014-12-22 14:15:56

标签: batch-file scripting

我一直试图在_1之后删除一些字符并重命名该文件但卡住了。让我输入示例文件名以明确说明。

aero_name_1_3_7.png
glik_trol_1_5_2_9_5.png
this_that_1_3_1_9.png
....... and so on. 

所以我的文件名包含确切的格式但名称不同,因此我想使用令牌和delim。重命名我的文件后应该看aero_name_1.png,glik_trol_1.png,this_that_1.png  这是我写的那条蝙蝠,但这不起作用。如果有人可以建议,那就太好了。

for /F "tokens=1-4,* delims=_" %%a in ('dir /A-D /B "*.png"') do (
  move "%%a_%%b" "%%a%%~xb"
)

由于

2 个答案:

答案 0 :(得分:1)

查看您的第二个文件名,这就是FOR / F循环所具有的内容:

%%a=glik
%%b=trol
%%c=1
%%d=5
%%e=2_9_5.png

所以你的MOVE命令变为:

move "glik_trol" "glik"

请注意,%%b没有扩展程序

您可以使用

for /f "tokens=1-3* delims=_" %%a in ('dir /a-d /b *.png') do (
  move "%%a_%%b_%%c_%%d" "%%a_%%b_%%c%%~xd"
)

如果您对正则表达式感到满意,那么您可以使用我方便的JREN.BAT utility - 一个混合JScript /批处理脚本,它通过执行正则表达式查找和替换名称来重命名文件。 JREN.BAT是纯脚本,可​​以在XP以后的任何Windows机器上本机运行。这是一种非常方便的方法,可以执行非常精确的重命名操作。

假设您当前目录中有JREN.BAT,或者更好,在PATH中的某个位置:

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

不需要批次。如果您在批处理脚本中使用该命令,那么您应该在命令前加CALL,因为JREN也是一个批处理脚本。

答案 1 :(得分:1)

根据您的要求,"删除_1"之后的一些字符,似乎最好的解决方案是使用substring substitution。不确定您是否会从中受益,但此解决方案也允许在_1之前提供可变数量的下划线 - 与您现在使用的"delims=_"更静态使用不同。

子串替换很适合从开头剥离部分(例如set "var=%var:*_1=%"),但剥离结束有点棘手。一种方法是将rem推入替换。

试试这个:

@echo off
setlocal

for %%I in (*.png) do call :ren "%%~I"

goto :EOF

:ren <filename>
set "pngfile=%~1"
echo "%pngfile%" | find "_1" >NUL || goto :EOF
set pngfile=%pngfile:_1=&rem.%
echo ren "%~1" "%pngfile%_1.png"