循环浏览文件夹中的所有文件,检查文件名的第一部分是否与diff文件夹中的任何文件匹配-如果不匹配则移动

时间:2019-01-03 10:16:52

标签: loops batch-file move

我有75,000个用于卡拉​​OK系统的文件。每首歌都有音乐(.mp3)和歌词(.cdg)。因此,每首歌曲都有两个文件。

Artist - SongName [Karaoke Brand1].mp3
Artist - SongName [Karaoke Brand1].cdg

问题在于某些歌曲的版本很多(5-10)。 Brand1是最好的,所以我只是使用标准的Windows搜索来过滤该品牌的所有文件,然后将其剪切并手动粘贴,从而为我提供了25,000个新的旧文件。

但是原始文件夹中有很多Brand1没有版本的歌曲。在这种情况下,我更喜欢Brand2Brand3,但并非每首歌都是由两者完成的。不管每首歌至少是由另一首来完成的。

我想遍历所有剩余的MP3文件(由于.cdg的名称具有相同的扩展名,但扩展名不同,因此无需查看全部):

"D:/Karaoke/All" 

并在方括号[wildcard?]之前获取文件名,然后查看是否已在其中找到版本:

"D:/Karaoke/Curated"

如果什么也不做,请移至下一个文件。

如果没有Brand2(如果存在)(完整文件名.mp3.cdg)移动到D:/Karaoke/Curated

如果Brand2不存在,请查看Brand3是否存在,并改用那个

所有品牌的文件命名都是相同的,只是括号[Brand]中的文本会有所不同。

编辑 到目前为止我想出的是什么

            @echo off
            setlocal enabledelayedexpansion
            for %%i in (*.mp3) do (
                for /f "tokens=1 delims=[" %%a in ("%%i") DO (
            REM get "checkable name first"
            REM     echo %%a
                    set checkName=%%a
            REM     echo !checkName!
                )
                echo !checkName!
            )
            exit

1 个答案:

答案 0 :(得分:1)

根据您的要求,这是一种可能的解决方案:

@echo off

cd /d "D:\Karaoke\All"
for %%A IN ("*.mp3") do (
    for /f "delims=[]" %%B IN ("%%~nA") do (
        dir /A "D:\Karaoke\Curated\%%B*" >nul 2>&1
        if errorlevel 1 (
            if exist "%%B[Karaoke Brand2].mp3" (
                move "%%B[Karaoke Brand2].*" "D:\Karaoke\Curated\"
            ) else (
                if exist "%%B[Karaoke Brand3].mp3" (
                    move "%%B[Karaoke Brand3].*" "D:\Karaoke\Curated\"
                )
            )
        )
    )
)