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

[文件操作] [已解决]如何批量的提取指定文件名中的特定字符串和数值格式来给文件重命名

本帖最后由 xinjinjie 于 2017-4-25 22:01 编辑

首先说明一下,已搜索多次,找到类似的帖子学习观摩,但是发现和我想要达到的效果都不太一样,所以才发新帖子来请教。

想要批量的将文件夹中的文件用文件名中的不连续字符串来给文件重命名,比如
文件名:[GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].mkv和[GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].ass,
改名为:GRANBLUE FANTASY_01.mkv和GRANBLUE FANTASY_01.ass。

我设想的是,在BAT代码里指定原始文件名中含有的部分字符串,比如“GRANBLUE FANTASY”、“Arrow”,判断文件夹中有含有这个字符串的文件时获取一个指定格式的数值,取出这个数值来和前面指定的字符串一起组成新的文件名。
比如:[aaaaaaaa][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].mkv,在代码里指定“GRANBLUE FANTASY”,“[??]”,最后改名为“GRANBLUE FANTASY_??.mkv”。
Arrow.S05E18.1080p.WEB-DL.DD5.1.H264-RARBG.mkv,在代码里指定“Arrow.S05”,“E??”,最后改名为“Arrow.S05_??.mkv”。
ass后缀名的文件用同样的方式来实现改名。

要实现这个效果,应该怎么来写BAT的代码呢?

借鉴ShowCode大大曾经给出的、解决另一个改文件名需求的代码,不完全符合这个需求,自己写了个没效果的代码,还请ShowCode大大和其他大大们指点
  1.    @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *GRANBLUE FANTASY*') do (
  4.     set "f=100%%~ni"
  5.     set "f=!f:[%%i]=!"
  6.     ren GRANBLUE FANTASY_"!f!"
  7. )
复制代码
符合需求的代码在21楼
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. for %%a in (*.mkv) do (
  3.     for /f "tokens=1,2 delims=[]" %%b in ("%%~na") do (
  4.         ren "%%~a" "%%b_%%c%%~xa"
  5.         ren "%%~na.ass" "%%b_%%c.ass"
  6.     )
  7. )
  8. pause
复制代码

TOP

回复 2# taofan712

这种for遍历文件的方式配合ren重命名需注意坑

TOP

回复 2# taofan712


   虽然不能完全看懂这个代码,不过通过自己的连蒙带猜,似乎是检查到是MKV后缀名的文件后,通过获取第一个“[]”内的字符串来重命名,具体怎么获取的数字部分没看懂,怎么获取的ass后缀名的文件和对ass文件重命名的方法也没看懂,不过这个不是重点想要说的。

因为实际使用中,有可能第一个“[]”内的字符串不是需要的新的文件名的字符串,比如:[aaaaaaaa][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].mkv,或者Arrow.S05E18.1080p.WEB-DL.DD5.1.H264-RARBG.mkv。这些情况的原始文件名的话,估计用层主这个代码是改不出想要的结果的。

所以,我设想的是,在BAT代码里指定原始文件名中含有的部分字符串,比如“GRANBLUE FANTASY”、“Arrow”,判断文件夹中有含有这个字符串的文件时获取一个指定格式的数值,取出这个数值来和前面指定的字符串一起组成新的文件名。
比如:[aaaaaaaa][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].mkv,在代码里指定“GRANBLUE FANTASY”,“[??]”,最后改名为“GRANBLUE FANTASY_??.mkv”。
Arrow.S05E18.1080p.WEB-DL.DD5.1.H264-RARBG.mkv,在代码里指定“Arrow.S05”,“E??”,最后改名为“Arrow.S05_??.mkv”。
ass后缀名的文件用同样的方式来实现改名。

要实现这个效果,应该怎么来写BAT的代码呢?

TOP

回复 4# xinjinjie

你这是批量解决问题,怎么可能在代码里指定某个具体文件名的关键字呢?
我之前写的是针对你一楼列举的情况,取第一和第二个[]中的字符。
你后面补充的内容,情况都不一样,需要加很多判断,特别麻烦。建议你自己学一下for和set,自己根据实际情况来写。
【for】http://www.bathome.net/thread-2189-1-1.html
【set】http://bbs.bathome.net/thread-14927-1-1.html
【if】http://www.bathome.net/thread-2530-1-1.html

TOP

回复 5# taofan712


    感谢您的指点,我找时间观摩学习。
另外,说明一下,类似需要判断文件名中是否存在某个关键字符串的功能,BAT代码应该是有的吧?比如*GRANBLUE FANTASY*。我想达到的效果就是在代码里写入一个类似*GRANBLUE FANTASY*的代码来判断,含有这个内容的才去取用“[??]”这个格式的数字,最后改名为GRANBLUE FANTASY_??.mkv

TOP

回复 6# xinjinjie


@echo off
for %%a in ("*GRANBLUE FANTASY*.mkv") do (
    for /f "tokens=1,2 delims=[]" %%b in ("%%~na") do (
        ren "%%~a" "%%b_%%c%%~xa"
        ren "%%~na.ass" "%%b_%%c.ass"
    )
)
pause

TOP

回复 7# ShowCode


    感谢ShowCode大大的指点,今天白天没什么时间,晚上有空了再来尝试、测试、研究。

TOP

回复 7# ShowCode


    已测试,没有达到效果,例如,原始文件名为:[FLsnow&SumiSora][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].mkv
运行这个代码后,被改名为了:FLsnow&SumiSora_GRANBLUE FANTASY-The Animation.mkv。文件名基本一致、关键字内容一致的的ass文件则完全没有被改名,[FLsnow&SumiSora][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].chs.ass

TOP

回复 7# ShowCode


    自己尝试着将代码改成下面的,没效果,估计是哪里没写对,期待指正。
  1. @echo off
  2. for %%a in ("*GRANBLUE FANTASY*.mkv") do (
  3.     for /f "tokens=1,2 delims=[]" %%b in ("%%~na") do (
  4.       ren "%%b_%%c%%~xa"
  5.     )
  6. )
复制代码

TOP

回复 9# xinjinjie


@echo off
for %%a in ("*GRANBLUE FANTASY*.mkv") do (
    for /f "tokens=1,2 delims=[]" %%b in ("%%~na") do (
        echo ren "%%~a" "%%b_%%c%%~xa"
        echo ren "%%~na.ass" "%%b_%%c.ass"
    )
)
pause
用 echo 命令观察一下就知道了,这个代码成功的前提是:视频文件名和字幕文件名相同。

[FLsnow&SumiSora][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].mkv
[FLsnow&SumiSora][GRANBLUE FANTASY-The Animation][01][TVRIP][1080p][HEVC_AAC].chs.ass
但是你这个例子里面两个文件名不一致,所以ass没能改名。

调整一下方法:
  1. @echo off
  2. for %%a in ("*GRANBLUE FANTASY*.mkv" "*GRANBLUE FANTASY*.ass") do (
  3.     for /f "tokens=1,2 delims=[]" %%b in ("%%~na") do (
  4.         echo ren "%%~a" "%%b_%%c%%~xa"
  5.     )
  6. )
  7. pause
复制代码

TOP

回复 11# ShowCode


    感谢ShowCode大大指点,刚才测试代码部分的新代码,结果还是没效果。

不过在CMD界面看到,好像获取到的新文件名有问题,显示在CMD界面的新文件名是“FLsnow&SumiSora_GRANBLUE FANTASY-The Animation.mkv”,没有了集数,01的MKV和02的MKV都是显示这个同样的新文件名,推测是因为这个原因改名没效果。另外两个的ass文件也是同样的,没有了集数、没改名成功。

TOP

回复 12# xinjinjie


@echo off
for %%a in ("*GRANBLUE FANTASY*.mkv" "*GRANBLUE FANTASY*.ass") do (
    for /f "tokens=1,2,3 delims=[]" %%b in ("%%~na") do (
        echo ren "%%~a" "%%b_%%c_%%d%%~xa"
    )
)
pause

试试这样能否看到集数?

TOP

回复 13# ShowCode

感谢ShowCode大大指点,刚才测试新代码,集数有了,但是改名结果的文件名不是想要的内容格式。

显示在CMD界面的新文件名是“FLsnow&SumiSora_GRANBLUE FANTASY-The Animation_01.mkv”,想要的新文件名是“GRANBLUE FANTASY_01.mkv”这种。

TOP

回复 14# xinjinjie


@echo off
for %%a in ("*GRANBLUE FANTASY*.mkv" "*GRANBLUE FANTASY*.ass") do (
    for /f "tokens=2,4 delims=[]-" %%b in ("%%~na") do (
        echo ren "%%~a" "%%b_%%c%%~xa"
    )
)
pause

TOP

返回列表