找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 83669|回复: 16

[文件操作] [已解决]批处理修改文件名删除特定两个字符之间字符

[复制链接]
发表于 2021-4-11 01:13:25 | 显示全部楼层 |阅读模式
本帖最后由 Alandx 于 2021-4-14 10:59 编辑

删除第一个_与倒数第二个_之间的字符,最好将最后一个_后的字符也删除。
例:
abc_xyz_a-a_654321_01_123.jpg
删除后得:
abc_01_123.jpg
最好:
abc_01.jpg
 楼主| 发表于 2021-4-11 02:12:21 | 显示全部楼层
@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
发表于 2021-4-11 04:59:19 | 显示全部楼层
"_" 数量是固定的吗?
发表于 2021-4-11 06:48:56 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2021-4-11 22:43:42 | 显示全部楼层
本帖最后由 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. )
复制代码
发表于 2021-4-11 23:01:18 | 显示全部楼层
本帖最后由 newswan 于 2021-4-12 00:31 编辑

段落数量可变,有 awk 方便多了,用shift 遍历参数麻烦些。
  1. dir /b *.jpg | awk -F '[_.]' '{print $1"_"$(NF-2)}'
复制代码
发表于 2021-4-12 10:02:28 | 显示全部楼层
回复 6# newswan

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

dir /b *.jpg |awk -F '[_.]' '{print $1"_"$(NF-2)"."$(NF)}'
发表于 2021-4-12 10:36:52 | 显示全部楼层
回复 7# netdzb


忘记 扩展名了。。
 楼主| 发表于 2021-4-12 11:50:58 | 显示全部楼层
回复 6# newswan

我是新手 问一下awk是什么?
发表于 2021-4-12 12:37:32 | 显示全部楼层
什么sed、awk之类的都属于第三方命令,需要下载所属代码,处理字符串较为方便,个人偏爱纯批,不受限制。
发表于 2021-4-12 13:40:08 | 显示全部楼层
回复 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
发表于 2021-4-12 14:16:50 | 显示全部楼层
也可以这样:
通过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
复制代码
发表于 2021-4-13 00:50:09 | 显示全部楼层
本帖最后由 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. )
复制代码
发表于 2021-4-13 06:23:08 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2021-4-13 14:56:55 | 显示全部楼层
回复 11# Batcher

感谢~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 15:08 , Processed in 0.021426 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表