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

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

[复制链接]
发表于 2017-4-10 20:02:17 | 显示全部楼层 |阅读模式
本帖最后由 xinjinjie 于 2017-4-11 22:17 编辑

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

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

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

L7,L8的代码貌似都可以对应该情况,我使用的代码简短点的
 楼主| 发表于 2017-4-10 20:39:41 | 显示全部楼层
又不是没搜索,不知道该搜索什么关键字,搜索了“文件名修改”,“关键字删除”等自己想到的标题,找不到想要的答案才发帖的!
发表于 2017-4-10 21:03:21 | 显示全部楼层
取文件名 放入变量 将文件名变成字符串进行删除, 将删除后的字符串重命名文件
  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
复制代码
 楼主| 发表于 2017-4-10 21:14:58 | 显示全部楼层
回复 3# dingcool


    虽然没用批处理代码来写过这种功能代码,不过大致能明白,这个代码似乎只是删除“String”这个内容的字符串内容,并没有完整的实现批处理当前文件夹中全部带有“String”内容的文件都重命名的效果吧?
发表于 2017-4-10 21:36:33 | 显示全部楼层
回复 2# xinjinjie

蜻蜓点水也算游泳?
http://www.bathome.net/search.ph ... p;searchsubmit=true
 楼主| 发表于 2017-4-10 22:02:05 | 显示全部楼层
回复 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"”应该需要调整,还请版主大大指点。
发表于 2017-4-10 22:05:45 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
xinjinjie + 1 乐于助人

查看全部评分

发表于 2017-4-10 22:48:31 | 显示全部楼层
  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技术 +1 收起 理由
xinjinjie + 1 乐于助人

查看全部评分

发表于 2017-4-10 23:01:51 | 显示全部楼层
回复 3# dingcool


    这个小题就用不着VB出马了吧……
话说写个VBS也行啊……
直接写批也可以啊……
 楼主| 发表于 2017-4-11 08:37:01 | 显示全部楼层
回复 8# ShowCode


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

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

后面3行代码里,哪行是在处理去掉指定字符串“_tract3”或者“_tract4”的呢?
 楼主| 发表于 2017-4-11 08:39:36 | 显示全部楼层
回复 7# taofan712


    感谢指点,确实有重名的可能性,只是一般这种情况在之前的处理中已经人工避免,但是有这种避免重名的判断是对的,可惜我没看懂代码……
发表于 2017-4-11 09:32:20 | 显示全部楼层
回复 11# xinjinjie


    你复制几个字幕文件单独测试一下呗
发表于 2017-4-11 10:23:19 | 显示全部楼层
回复 10# xinjinjie


看你自己的需求吧,如果只有ass一种文件,那加不加限定无所谓。
第5行的字符串截取。
 楼主| 发表于 2017-4-11 12:54:03 | 显示全部楼层
回复 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!",这句代码是怎么一个处理方法?还请指点一下具体方法,怎么实现的截取?
发表于 2017-4-11 15:01:37 | 显示全部楼层
回复 14# xinjinjie


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

问题2:找个 set 命令的教程看看关于字符串截取 http://bbs.bathome.net/forum-33-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 17:25 , Processed in 0.012375 second(s), 11 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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