我需要一个批处理文件(Windows CMD 是解释器,一个 .bat)来完成此类任务:
1) 搜索文件夹及其子文件夹
2) 查找具有相同文件名和扩展名的文件(也称为重复文件)
3) 检查它们是否具有相同的大小
4) 如果名称相同 + 大小相同,回显除第一个文件之外的所有文件(实际上我需要删除除一个副本以外的所有文件)
感谢任何类型的帮助
这只是一个初始脚本,仅用于检查文件夹及其子文件夹中的文件及其大小:
@Echo off
Setlocal EnableDelayedExpansion
Set Dir=C:\NewFolder
For /r "%Dir%" %%i in (*) do (
Set FileName=%%~nxi
Set FullPath=%%i
Set Size=%%~zi
Echo "!FullPath!" - SIZE: !Size!
)
Echo.
Pause
最佳答案
此脚本会按照您的要求进行操作。只需将顶部的 ROOT 变量设置为指向树的根即可。
@echo off
setlocal disableDelayedExpansion
set root="c:\test"
set "prevTest=none"
set "prevFile=none"
for /f "tokens=1-3 delims=:" %%A in (
'"(for /r "%root%" %%F in (*) do @echo %%~znxF:%%~fF:)|sort"'
) do (
set "currTest=%%A"
set "currFile=%%B:%%C"
setlocal enableDelayedExpansion
if !currTest! equ !prevTest! echo "!currFile!"
endlocal
set "prevTest=%%A"
)
但是你可以通过FC来比较文件的内容,使测试更加精确。此外,您可以将 DEL 命令直接合并到脚本中。下面的脚本打印出删除重复文件的命令。当您准备好实际删除文件时,删除 DEL 命令前的 ECHO。
@echo off
setlocal disableDelayedExpansion
set root="c:\test"
set "prevTest=none"
set "prevFile=none"
for /f "tokens=1-3 delims=:" %%A in (
'"(for /r "%root%" %%F in (*) do @echo %%~znxF:%%~fF:)|sort"'
) do (
set "currTest=%%A"
set "currFile=%%B:%%C"
setlocal enableDelayedExpansion
set "match="
if !currTest! equ !prevTest! fc /b "!prevFile!" "!currFile!" >nul && set match=1
if defined match (
echo del "!currFile!"
endlocal
) else (
endlocal
set "prevTest=%%A"
set "prevFile=%%B:%%C"
)
)
两组代码可能看起来过于复杂,但这只是因为我将代码结构化为健壮的并且避免了可能困扰简单解决方案的问题。例如,如果启用延迟扩展,文件名中的 !
可能会导致 FOR 变量出现问题,而文件名中的 =
会导致 npocmoka 的解决方案出现问题。
关于Windows批处理文件在树中查找重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076097/