如何根据条件递归批量重命名文件

时间:2018-01-22 13:49:02

标签: batch-file recursion file-rename batch-rename

我一直在寻找过去几个小时,找不到一个简单的方法来做到这一点。

情景:

PARENT_FOLDER  
----YEAR_FOLDER  
--------MOVIE1_FOLDER  
----------Movie1_Title.Ext  
----------Eng.Srt  
--------MOVIE2_FOLDER  
----------Movie2_Title.Ext  
----------02_ENG.SRT  
----------03_ENG.SRT  
--------MOVIE3_FOLDER  
----------Movie3_Title.Ext  
----------ENG.SRT  
----------ENG-SDH.SRT  
--------MOVIE4_FOLDER  
----------Movie4_title.ext  
----------Movie4.Randomstuff.SRT  
--------MOVIE5_FOLDER  
----------Movie5_title.ext  
----------randomstuff.eng.srt 

我想找到一些方法来创建批处理脚本,以递归方式将SRT文件重命名为VIDEO文件(AVI,MKV或MP4)。 如果有2,我想尽可能使用最大的一个,或者如果SRT名称有一个SDH将它添加到最后(Movie_Title.SDH.srt)。

我试过了:

@echo off  
if exist "*SDH.srt" (  
for %%f in ("*.avi") do ren *.srt "%%~nf.SDH.srt"  
) else (  
for %%f in ("*.avi") do ren *.srt "%%~nf.srt"  
) 
for %%f in ("*.avi") do ren *.srt "%%~nf.srt" 

最后一行是获取第二个文件(如果有的话)(我在没有它的情况下尝试过它)......这根本不起作用。我有两个文件,一个是SDH,没有正确重命名。

唯一有效的是:

for %%f in ("*.avi") do ren *.srt "%%~nf.srt" 

它只重命名了第一个找到的,必须在目录中运行。我在“for”之后添加了/ R,但它不能递归地工作。我试图将其分解,并使用示例目录和文件名分步进行,但这只是让脑力训练达到了一个全新的水平。
我甚至接近让这个工作吗?

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
FOR /d /r "%sourcedir%" %%a IN (*) DO (
 REM %%a contains directory name. Look for movie file
 FOR %%x IN (mkv avi mp4) DO (
  IF EXIST "%%a\*.%%x" FOR %%m IN ("%%a\*.%%x") DO (
   REM Look for *SDH.SRT file
   IF EXIST "%%a\*SDH.SRT" (ECHO REN "%%a\*SDH.SRT" "%%~nmSDH.SRT"
   ) ELSE (
    SET "renamed="
    FOR /f "delims=" %%s IN ('dir /b /a-d /o-s "%%a\*.srt"') DO IF NOT DEFINED renamed (
     ECHO REN "%%a\%%s" "%%~nm.SRT"
     SET "renamed=Y"
    )
   )
  )
 )
)

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO REN更改为REN以实际重命名文件。

首先对目录名称进行递归扫描到%%a。找到每个目录后,在%%x中查找所需的扩展名之一(我假设任何目录中只有一个),如果存在,则将%%m设置为其名称。

在所找到的目录中查找*SDH.SRT,如果存在,请在%%m之前使用SDH.SRT的名称部分重命名该*SDH.SRT。如果没有renamed文件,请清除*.srt标志,然后以相反的顺序对目录中的for/f文件名执行目录扫描,以便最大的列表首先列出。 %%s将文件名依次分配给renamed,因此可以重命名所需的largest-.srt文件,然后将*.srt标志设置为一个值,使其成为*.srt 已定义,因此在目录中找到的其他== liste_caracteristiques |------ |------ |//**idCarac**//|int(11)|Non| |//**refproduit**//|int(11)|Non| |valeur|varchar(255)|Oui|NULL |0|4942|Windows |0|8149|Android |1|9980|300 |1|10300|1100 |1|10316|149.5 |2|4942|7 |2|8149|12 |2|9980|15cm |2|10300|4cm |2|10316|8.3cm 文件将重命名。

我故意在其名称中使用了一个包含空格的目录进行测试,因此使用包含空格的文件/目录名进行处理似乎是正确的。我不会评论丢失== caracteristiques |------ |------ |//**idCarac**//|int(11)|Non| |libelleCarac|varchar(255)|Oui|NULL |0|Système d'exploitation |1|Poids |2|Screen size |3|ATEX |4|Zone 0 |5|Zone 1 |6|Zone 2 文件或包含毒药字符的文件名可能会如何。