[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理如何删除文件名中的指定字符串?

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

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

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

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

L7,L8的代码貌似都可以对应该情况,我使用的代码简短点的

回复 16# xinjinjie


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

TOP

本帖最后由 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.     )
复制代码

TOP

回复 14# xinjinjie


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

问题2:找个 set 命令的教程看看关于字符串截取 http://bbs.bathome.net/forum-33-1.html

TOP

回复 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!",这句代码是怎么一个处理方法?还请指点一下具体方法,怎么实现的截取?

TOP

回复 10# xinjinjie


看你自己的需求吧,如果只有ass一种文件,那加不加限定无所谓。
第5行的字符串截取。

TOP

回复 11# xinjinjie


    你复制几个字幕文件单独测试一下呗

TOP

回复 7# taofan712


    感谢指点,确实有重名的可能性,只是一般这种情况在之前的处理中已经人工避免,但是有这种避免重名的判断是对的,可惜我没看懂代码……

TOP

回复 8# ShowCode


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

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

后面3行代码里,哪行是在处理去掉指定字符串“_tract3”或者“_tract4”的呢?

TOP

回复 3# dingcool


    这个小题就用不着VB出马了吧……
话说写个VBS也行啊……
直接写批也可以啊……

TOP

  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

评分人数

TOP

本帖最后由 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
复制代码
你举例的情况很可能出现改名后文件名重复,加个判断解决。
1

评分人数

TOP

回复 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"”应该需要调整,还请版主大大指点。

TOP

回复 2# xinjinjie

蜻蜓点水也算游泳?
http://www.bathome.net/search.ph ... p;searchsubmit=true

TOP

回复 3# dingcool


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

TOP

返回列表