Windows批处理文件在树中查找重复项

标签 windows batch-file cmd

我需要一个批处理文件(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/

相关文章:

c++ - 如何使用 IFileOpenDialog 打开 *modal* 文件对话框?

c++ - window操作系统下c控制台运行时禁用全键鼠

batch-file - 使用标题元数据作为输出文件名 ffmpeg

c# - 如何获取 BAT 文件的输出并将其保存为字符串

c - 在 C system() 函数中隐藏控制台,Win

c++ - 是否可以在 Windows C++ 中以编程方式检查我的笔记本电脑是通过 Wi-Fi 连接还是通过 "wired LAN"连接?

windows - Vim:Mac 与 Linux ^M 问题

windows - 如何将基于列表(txt)的文件批量复制到具有相同目录结构的另一个文件夹?

相当于简单 DOS 命令行的 Powershell : "copy *.ps1 *.ps1.bak/y"

windows - 如何获取包含插入符号 (^) 的密码,将其作为参数原封不动地传递给 Windows 批处理文件?