标题: [文件操作] [已解决]批处理修改文件名删除特定两个字符之间字符 [打印本页]
作者: 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
_数量不固定可以这样。- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.jpg) do (
- set n=1
- set str=%%a
- set str=!str:_= !
- for %%b in (!str!) do (
- if !n!==1 (
- set str1=%%b&set n=0
- ) else if "%%b"=="%%~nb" (
- set str2=%%b
- )
- )
- ren "%%a" "!str1!_!str2!.jpg"
- )
- pause
复制代码
作者: newswan 时间: 2021-4-11 22:43
本帖最后由 newswan 于 2021-4-11 23:09 编辑
固定段落数量- for /f "usebackq tokens=1,5,7 delims=_." %%i in (`dir /b *.jpg`) do (
- echo %%i %%j %%k
- )
复制代码
作者: newswan 时间: 2021-4-11 23:01
本帖最后由 newswan 于 2021-4-12 00:31 编辑
段落数量可变,有 awk 方便多了,用shift 遍历参数麻烦些。- 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-=?,来控制文件名是要保留倒数第几段字符。- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.jpg) do (
- set n=0
- set str=%%a
- set str=!str:_= !
- for %%b in (!str!) do (
- set /a n+=1
- set /a m=!n!%%10
- set str!m!=%%b
- )
- set /a m-=1
- for %%c in (str!m!) do ren "%%a" "!str1!_!%%c!.jpg"
- )
- pause
复制代码
作者: newswan 时间: 2021-4-13 00:50
本帖最后由 newswan 于 2021-4-13 00:55 编辑
回复 12# qixiaobin0715
每个字段分别保存到一个变量,通过for语句进行2次变量扩展。- for %%a in (*.jpg) do (
- set str=%%~na
- set str=!str:_= !
- set n=0
- for %%a in (!str!) do (
- set /a n+=1
- set str!n!=%%a
- )
- set /a m=n-1
- set str
- for %%a in (str!m!) do echo !%%a!
- )
复制代码
作者: qixiaobin0715 时间: 2021-4-13 06:23
回复 13# newswan
画蛇添足是我经常出现的问题,谢谢提醒。应修改为:- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.jpg) do (
- set n=0
- set str=%%a
- set str=!str:_= !
- for %%b in (!str!) do (
- set /a n+=1
- set str!n!=%%b
- )
- set /a n-=1
- for %%c in (str!n!) do ren "%%a" "!str1!_!%%c!.jpg"
- )
- 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 |