Board logo

标题: [文件操作] [已解决]批处理如何删除文件名中的指定字符串? [打印本页]

作者: xinjinjie    时间: 2017-4-10 20:02     标题: [已解决]批处理如何删除文件名中的指定字符串?

本帖最后由 xinjinjie 于 2017-4-11 22:17 编辑

最近在处理视频的字幕文件,ASS格式和其他格式的字幕文件时发现一个可以通过批处理来优化处理速度的情况,但是不知道这种情况的批处理代码该怎么写,来求助大家,还请指点一下。

比如文件夹内的字幕文件带有“_tract3”或者“_tract4”的关键字,需要将这个关键字内容在改文件名时去掉。

例如:AAAA_tract3.ass,想要改名成AAAA.ass。AAAA的内容可能是不同的复数个内容,要怎么来写这个批处理代码呢?

L7,L8的代码貌似都可以对应该情况,我使用的代码简短点的
作者: xinjinjie    时间: 2017-4-10 20:39

又不是没搜索,不知道该搜索什么关键字,搜索了“文件名修改”,“关键字删除”等自己想到的标题,找不到想要的答案才发帖的!
作者: dingcool    时间: 2017-4-10 21:03

取文件名 放入变量 将文件名变成字符串进行删除, 将删除后的字符串重命名文件
  1. Private Function DelStrInStr(oldstr As String, delstr As String) As String '删除指定字符串函数
  2. DelStrInStr = oldstr
  3. Dim a, oldlen, dellen As Integer
  4. a = InStr(oldstr, delstr)
  5. If a <> 0 Then
  6.            oldlen = Len(oldstr)
  7.            dellen = Len(delstr)
  8.            DelStrInStr = Left(oldstr, a - 1) + Right(oldstr, oldlen - a + 1 - dellen)
  9. End If
  10. End Function
复制代码

作者: xinjinjie    时间: 2017-4-10 21:14

回复 3# dingcool


    虽然没用批处理代码来写过这种功能代码,不过大致能明白,这个代码似乎只是删除“String”这个内容的字符串内容,并没有完整的实现批处理当前文件夹中全部带有“String”内容的文件都重命名的效果吧?
作者: pcl_test    时间: 2017-4-10 21:36

回复 2# xinjinjie

蜻蜓点水也算游泳?
http://www.bathome.net/search.ph ... p;searchsubmit=true
作者: xinjinjie    时间: 2017-4-10 22:02

回复 5# pcl_test


        @echo off&setlocal enabledelayedexpansion
    for /f "delims=" %%a in ('dir /a-d/b *_EN*') do (
        set "name=%%~na"
        for /f "tokens=1 delims=|" %%b in ("!name:_EN=|!") do echo;ren "%%a" "%%b%%~xa"
    )
    pause

这是版主大大在16年回复的另一个帖子里类似情况的处理代码,通过大大提供的搜索链接查到的,不过这个代码功能应该是“指定字符串及其后面的字符串”,我只需要删除指定字符串。

虽然不熟悉BAT代码,不过个人推断,前面三行代码应该不用改,第四行“for /f "tokens=1 delims=|" %%b in ("!name:_EN=|!") do echo;ren "%%a" "%%b%%~xa"”应该需要调整,还请版主大大指点。
作者: taofan712    时间: 2017-4-10 22:05

本帖最后由 taofan712 于 2017-4-10 22:07 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,2 delims=_" %%a in ('dir /a-d /b *.ass^|find "tract"') do (
  4. if not exist "%%~a.ass" (
  5. ren "%%~a_%%~b.ass" "%%~a.ass"
  6. ) else (
  7. call :aa "%%~a" "%%~b"
  8. set /a n=0
  9. )
  10. )
  11. pause&exit /b
  12. :aa
  13. set /a n+=1
  14. if exist "%~1_!n!.ass" goto aa
  15. ren "%~1_%~2" "%~1_!n!.ass"
  16. goto :eof
复制代码
你举例的情况很可能出现改名后文件名重复,加个判断解决。
作者: ShowCode    时间: 2017-4-10 22:48

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b *.ass ^| find "tract"') do (
  4.     set "str=%%i"
  5.     set "str=!str:~0,-11!"
  6.     ren "%%i" "!str!.ass"
  7. )
复制代码

作者: 老刘1号    时间: 2017-4-10 23:01

回复 3# dingcool


    这个小题就用不着VB出马了吧……
话说写个VBS也行啊……
直接写批也可以啊……
作者: xinjinjie    时间: 2017-4-11 08:37

回复 8# ShowCode


    这个代码也版主大大的代码很类似,有些疑问请教:

for /f "delims=" %%i in ('dir /a-d /b *.ass ^| find "tract"') ,这里似乎是在搜索文件,符合后缀名是.ass并且含有“tract”的字符串的才执行后面的代码吗?感觉好像没有限定后缀名的必要……

后面3行代码里,哪行是在处理去掉指定字符串“_tract3”或者“_tract4”的呢?
作者: xinjinjie    时间: 2017-4-11 08:39

回复 7# taofan712


    感谢指点,确实有重名的可能性,只是一般这种情况在之前的处理中已经人工避免,但是有这种避免重名的判断是对的,可惜我没看懂代码……
作者: taofan712    时间: 2017-4-11 09:32

回复 11# xinjinjie


    你复制几个字幕文件单独测试一下呗
作者: ShowCode    时间: 2017-4-11 10:23

回复 10# xinjinjie


看你自己的需求吧,如果只有ass一种文件,那加不加限定无所谓。
第5行的字符串截取。
作者: xinjinjie    时间: 2017-4-11 12:54

回复 13# ShowCode

如果要搜索判断只要含有那个关键字的文件都符合条件的话,for /f "delims=" %%i in ('dir /a-d /b *.ass ^| find "tract"') 这里应该怎么改呢?是不是这样:for /f "delims=" %%i in ('dir /a-d /b *_tract3')?

    set "str=!str:~0,-11!",这句代码是怎么一个处理方法?还请指点一下具体方法,怎么实现的截取?
作者: ShowCode    时间: 2017-4-11 15:01

回复 14# xinjinjie


问题1:请自己测试一下,遇到问题再提问。

问题2:找个 set 命令的教程看看关于字符串截取 http://bbs.bathome.net/forum-33-1.html
作者: xinjinjie    时间: 2017-4-11 20:37

本帖最后由 pcl_test 于 2017-4-11 22:29 编辑

回复 15# ShowCode
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b *_tract3*) do (
  4.         set "str=%%i"
  5.         set "str=!str:~0,-11!"
  6.         ren "%%i" "!str!.ass"
  7.     )
复制代码
用这个代码测试,没有效果,是错在哪里呢?

找到错误在哪里了,下面的代码有效果了,虽然不太明白为什么要加单引号……
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b *_tract3*') do (
  4.         set "str=%%i"
  5.         set "str=!str:~0,-11!"
  6.         ren "%%i" "!str!.ass"
  7.     )
复制代码

作者: ShowCode    时间: 2017-4-11 22:20

回复 16# xinjinjie


    这是for命令的语法规定的,不需要理解,只需要记住。




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