根据同一文件夹中的部分文件名匹配重命名文件名的子字符串

根据同一文件夹中的部分文件名匹配重命名文件名的子字符串

我有一个装满文件(.avi 和 .txt 文件)的文件夹:

'MyVideo1-MyEncode.avi'
'MyVideo1.avi 16-05-2019 15-41-01.txt'

'My Video 2.avi'
'My Video 2.avi 16-05-2019 16-43-11.txt'

'My Video 3 [Summer]-MyEncode.avi'
'My Video 3 [Summer].avi 16-05-2019 17-57-24.txt'

'My Video 4-(Fall).avi'
'My Video 4-(Fall).avi 13-05-2019 19-29-16.txt'

'My Video 5-(Winter)-MyEncode.avi'
'My Video 5-(Winter).avi 11-05-2019 11-15-05.txt'

如果 .avi 文件包含“-MyEncode”在文件名中,我想将这部分字符串复制到相应文本文件的文件名中。

例如

“MyVideo1-MyEncode.avi”包括文本“-MyEncode”在文件名中

所以: “MyVideo1.avi 16-05-2019 15-41-01.txt”

应重命名为: “MyVideo1-MyEncode.avi 16-05-2019 15-41-01.txt”

另一方面:

“我的视频 2.avi” 才不是包含字符串“-MyEncode”,因此相应的.txt文件不应被重命名。

我有许多包含此类文件的文件夹。

我想我需要运行 cmd 行或者批处理文件来执行类似的操作:

for /R %x in (*.avi) do ren "%x" *.txt

但这并不能解释部分文件名匹配。

有人可以帮忙吗?

PS - 如果我让事情变得更简单,我可以将“My Video 3 [Summer]-MyEncode.avi”重命名为“My_Video_3_[Summer]-MyEncode.avi”(即删除空格)

答案1

这对我来说最终成了一团糟,因为它-MyEncode被放在了文件名的中间,但这是我想到的,它根据您提供的信息起作用:

@echo off

set "dir=C:\Your\Directory"
set "enc=-MyEncode"

setlocal EnableDelayedExpansion
for /r "%dir%" %%A in ("*%enc%*.avi") do (
    set "sub=%%~nxA"
    set "name=!sub:~0,-13!"
    for /r "%dir%" %%B in ("*!name!*.txt") do (
        set "txt=%%~nxB"
        set "num=!txt:~-24!"
        set "fin=!name!!enc!.avi!num!"
        if not !txt!==!fin! ren "%dir%\!txt!" "!fin!"
    )
)
endlocal

首先,setlocal EnableDelayedExpansion是必需的,因为我们要处理嵌套 for 循环中使用的变量。这些变量用于使事情更容易理解,并且在您返回和编辑时更容易更改,因此我预先为文件所在的目录 ( dir) 和要插入文件名的字符串 ( enc) 设置了变量。

初始 for 循环检查目录中包含字符串 的所有 .avi 文件实例-MyEncode,并且对于每个实例/迭代,%%A都会返回一个参数并用于do其他几个命令。初始循环中的第一个命令使用参数的sub文件名 ( n) 和扩展名 ( ) 设置一个变量 ( ) - 这会切断所有目录信息,因为我们不需要它。第二个命令使用我们的新变量来设置一个较新的变量 ( ),该变量从文件名中减去最后 13 个字符(最后 13 个是),以便我们可以将它用于下一部分:嵌套 for 循环。x%%Asubname-MyEncode.avi

与初始 for 循环一样,嵌套循环也在目录中查找 - 但不是查找包含enc变量的 .avi 文件,而是查找包含新name变量的 .txt 文件。设置变量时的第一个命令txt是将其缩减%%B为文件名和扩展名,然后我们设置一个num变量,将变量缩减txt为最后 24 个字符(末尾的数字和空格)。最后,它将变量设置fin为我们想要的新文本文件的名称:!name!!enc!.avi!num!- 这是在初始 for 循环中建立的名称,在-MyEncode其后添加,.avi在其后添加,然后是末尾原来的数字。从这里,我们使用一个if not命令来表示:对于所有txt不等于其fin对应值的变量,将 重命名txtfin。我if not在这里使用是因为已经更改为反映其对应 .avi 文件的文本文件不需要再次重命名。

希望这有帮助!

相关内容