Board logo

标题: [文件操作] [已解决]批处理修改文件名删除特定两个字符之间字符 [打印本页]

作者: Alandx    时间: 2021-4-11 01:13     标题: [已解决]批处理修改文件名删除特定两个字符之间字符

本帖最后由 Alandx 于 2021-4-14 10:59 编辑

删除第一个_与倒数第二个_之间的字符,最好将最后一个_后的字符也删除。
例:
abc_xyz_a-a_654321_01_123.jpg
删除后得:
abc_01_123.jpg
最好:
abc_01.jpg
作者: Alandx    时间: 2021-4-11 02:12

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b *.jpg') do (
    set $=%%a
    echo !$!
    for /f "tokens=1,5* delims=_" %%i in ('dir /b !$!') do (
        echo %%i %%j %%k
        pause
        ren "!$!" "%%i_%%j_%%k"
    )
)
endlocal
pause
作者: newswan    时间: 2021-4-11 04:59

"_" 数量是固定的吗?
作者: qixiaobin0715    时间: 2021-4-11 06:48

本帖最后由 qixiaobin0715 于 2021-4-11 06:50 编辑

回复 3# newswan
_数量不固定可以这样。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.jpg) do (
  4.     set n=1
  5.     set str=%%a
  6.     set str=!str:_= !
  7.     for %%b in (!str!) do (
  8.         if !n!==1 (
  9.             set str1=%%b&set n=0
  10.         ) else if "%%b"=="%%~nb" (
  11.             set str2=%%b
  12.         )
  13.     )
  14. ren "%%a" "!str1!_!str2!.jpg"
  15. )
  16. pause
复制代码

作者: newswan    时间: 2021-4-11 22:43

本帖最后由 newswan 于 2021-4-11 23:09 编辑

固定段落数量
  1. for /f "usebackq tokens=1,5,7 delims=_." %%i in (`dir /b *.jpg`) do (
  2.     echo %%i %%j %%k
  3. )
复制代码

作者: newswan    时间: 2021-4-11 23:01

本帖最后由 newswan 于 2021-4-12 00:31 编辑

段落数量可变,有 awk 方便多了,用shift 遍历参数麻烦些。
  1. dir /b *.jpg | awk -F '[_.]' '{print $1"_"$(NF-2)}'
复制代码

作者: netdzb    时间: 2021-4-12 10:02

回复 6# newswan

你的代码有问题,正确的应该如下:

dir /b *.jpg |awk -F '[_.]' '{print $1"_"$(NF-2)"."$(NF)}'
作者: newswan    时间: 2021-4-12 10:36

回复 7# netdzb


忘记 扩展名了。。
作者: Alandx    时间: 2021-4-12 11:50

回复 6# newswan

我是新手 问一下awk是什么?
作者: qixiaobin0715    时间: 2021-4-12 12:37

什么sed、awk之类的都属于第三方命令,需要下载所属代码,处理字符串较为方便,个人偏爱纯批,不受限制。
作者: Batcher    时间: 2021-4-12 13:40

回复 9# Alandx


sed和awk(gawk)是Linux系统里面两个非常强大的文本处理命令
Windows能用的版本可以在这里下载:
http://bcn.bathome.net/s/tool/index.html?key=sed
http://bcn.bathome.net/s/tool/index.html?key=gawk
作者: qixiaobin0715    时间: 2021-4-12 14:16

也可以这样:
通过set /a m-=?,来控制文件名是要保留倒数第几段字符。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.jpg) do (
  4.     set n=0
  5.     set str=%%a
  6.     set str=!str:_= !
  7.     for %%b in (!str!) do (
  8.         set /a n+=1
  9.         set /a m=!n!%%10
  10.         set str!m!=%%b
  11.     )
  12.     set /a m-=1
  13.     for %%c in (str!m!) do ren "%%a" "!str1!_!%%c!.jpg"
  14. )
  15. pause
复制代码

作者: newswan    时间: 2021-4-13 00:50

本帖最后由 newswan 于 2021-4-13 00:55 编辑

回复 12# qixiaobin0715

每个字段分别保存到一个变量,通过for语句进行2次变量扩展。
  1. for %%a in (*.jpg) do (
  2.     set str=%%~na
  3.     set str=!str:_= !
  4.     set n=0
  5.     for %%a in (!str!) do (
  6.         set /a n+=1
  7.         set str!n!=%%a
  8.     )
  9.     set /a m=n-1
  10.     set str
  11.     for %%a in (str!m!) do echo !%%a!
  12. )
复制代码

作者: qixiaobin0715    时间: 2021-4-13 06:23

回复 13# newswan

画蛇添足是我经常出现的问题,谢谢提醒。应修改为:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.jpg) do (
  4.     set n=0
  5.     set str=%%a
  6.     set str=!str:_= !
  7.     for %%b in (!str!) do (
  8.         set /a n+=1
  9.         set str!n!=%%b
  10.     )
  11.     set /a n-=1
  12.     for %%c in (str!n!) do ren "%%a" "!str1!_!%%c!.jpg"
  13. )
  14. pause
复制代码

作者: Alandx    时间: 2021-4-13 14:56

回复 11# Batcher

感谢~~
作者: Alandx    时间: 2021-4-13 15:10

回复 14# qixiaobin0715

最后一句还需要通过循环来吗?能不能直接改名?
作者: qixiaobin0715    时间: 2021-4-13 15:17

回复 16# Alandx
变量延迟转换,假借而已,实际上并没有循环。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2