Windows 批处理文件-在char之前检测重复的文件名?

Windows 批处理文件-在char之前检测重复的文件名?,windows,batch-file,cmd,duplicates,Windows,Batch File,Cmd,Duplicates,我在文件夹“D:\karaoke\”中有70000首卡拉OK歌曲。每个都有两个文件 artist - songname [GT karaoke].mp3 artist - songname [GT karaoke].cdg artist - songname [SJ karaoke].mp3 artist - songname [SJ karaoke].cdg artist - songname [AF karaoke].mp3 artist - songname [AF karaoke].cd

我在文件夹“D:\karaoke\”中有70000首卡拉OK歌曲。每个都有两个文件

artist - songname [GT karaoke].mp3
artist - songname [GT karaoke].cdg
artist - songname [SJ karaoke].mp3
artist - songname [SJ karaoke].cdg
artist - songname [AF karaoke].mp3
artist - songname [AF karaoke].cdg

假设上面的所有文件都代表同一首歌。我希望将AF版本保留在原来的位置,并将所有其他匹配的文件移动到名为“D:\Karaoke\duplicates\”的新文件夹中。如果不存在AF版本,则不执行任何操作。需要在[AF KARAOK]之前获取文件名,因为该文件名在该点之后是唯一的。

如果在这些文件所在的同一文件夹中使用命令行,请尝试以下操作:



对于bat文件:



  • Obs.:如果要查看移动命令结果,只需删除行/命令末尾的
    >nul


好吧,我会从另一边骑马,开始搜索(
.mp3
)文件,这些文件的名称包含
[AF karaoke]
,如果找到了,就做些别的事情,不要‐与此类似,假设所有文件名只包含一对括号(
[
]
):

@echo关闭
rem//更改为工作目录:
按“D:\卡拉OK”和(
rem//如果尚未完成,则为dublicate项创建子目录:
2> nul mkdir“重复”
rem//枚举名称中包含“[AF卡拉OK]”的“.mp3”文件:
对于/F“tokens=1-3 delims=[]eol=]”中的%%A('dir/B/A:-D-H-S“*[AF karaoke].mp3“'),请执行以下操作:(
rem//枚举在“[`之前部分名称相同的所有文件:
对于/F“tokens=1-3 delims=[]下线=]”中的%%D('dir/B/A:-D-H-S“%%A[?卡拉OK].*”)do(
rem//排除名称中包含“[AF KARAOK]”的文件,并移动其余文件:
如果/I不是“%%E”==“AF卡拉OK”回音移动“%%D[%%E]%F”“重复”
)
)
rem//返回到原始目录:
邻苯二胺
)
此脚本并不真正关心文件扩展名(如
.mp3
.cdg
),也不关心括号中字符串的开头,而不是
AF
(如
GT
SJ


测试正确的输出后,删除
move
命令前面的大写
ECHO
命令

问题是移动所有的东西,除了
“*[AF k*]..
哼,我的英语,你知道!有限,thkX!是怎么回事“*.cdg”?保持还是移动?cdg是与mp3计时相匹配的歌词部分。cdg必须与其相应的mp3保持一致。如果mp3移动,cdg必须移动牙床!这工作!我更改了这部分('dir/B/A:-D-H-s'%%A[??karaoke].*”)到('dir/B/A:-D-H-S“%%A[*karaoke].*”),因为它在品牌名称中并不总是两个字母。在我对一些较小的批次所做的几次测试中,它起到了作用。但是,您可以看到其他方面的任何问题吗?也感谢代码中的注释。现在很容易理解。
For %F in (*)do echo/%~nF|find /v /i "[AF k" >nul && move "%~dpnxF" "D:\Karaoke\duplicates\" >nul
@echo off && cd /d "d:\folder\where\files\are"
For %%F in (*)do echo/%%~nF|find /v /i "[AF k" >nul && move "%%~dpnxF" "D:\Karaoke\duplicates\" >nul