Batch file 使用Windows命令行删除重复文件

Batch file 使用Windows命令行删除重复文件,batch-file,Batch File,给定两个目录c:\foo和c:\bar,我想删除c:\bar中与c:\foo中存在的文件相同的文件。我可以使用fc命令将c:\bar中的每个文件与c:\foo中同名的文件进行比较,并手动删除重复的文件。有没有一种简单的方法可以使用CMD自动执行此操作 @echo off cd c:\bar for %%a in (*.*) do for %%b in ("c:\foo\%%a") do ( if exist "%%b" ( if "%%~Ta %%~Za" equ "%%~T

给定两个目录c:\foo和c:\bar,我想删除c:\bar中与c:\foo中存在的文件相同的文件。我可以使用fc命令将c:\bar中的每个文件与c:\foo中同名的文件进行比较,并手动删除重复的文件。有没有一种简单的方法可以使用CMD自动执行此操作

@echo off

cd c:\bar
for %%a in (*.*) do for %%b in ("c:\foo\%%a") do (
   if exist "%%b" (
      if "%%~Ta %%~Za" equ "%%~Tb %%~Zb" (
         del "%%a"
      ) else (
         fc "%%a" "%%b" > NUL
         if not errorlevel 1 del "%%a"
      )
   )
)
如果两个文件可能具有不同的修改日期但相同,请删除比较中的
%%~T..
部分


如果两个文件可能具有不同的修改日期,但相同,请删除比较中的
%%T..
部分。

如果相同意味着:在所有方面,不仅在日期和大小上,因此强制进行二进制比较

@ECHO OFF >NUL
SETLOCAL enableextensions
pushd "D:\bat\FooBar"
for /F "delims=" %%G in ('dir /B /A:-D *.*') do (
  call :proFC "%%~fG" "D:\bat\FooFoo\%%~nxG"
)
popd
ENDLOCAL
goto :eof

:raiseerror
exit /B %1

:proFC
  call :raiseerror 321
  fc /B "%~1" "%~2" >NUL 2>&1
  if %errorlevel% EQU 0 (
    echo del "%~1"
  ) else (
    echo %errorlevel% "%~2"
  )
goto :eof
评论了上述脚本中的关键点:

  • pushd…
    切换当前工作目录
  • for/F…
    循环处理Bar文件夹的静态文件列表
    • 调用:proFC…
      并正确引用
  • popd
    将当前工作目录切换回
  • goto:eof
    结束脚本
:raiseerror
子例程通过
退出/B%1返回退出代码

:proFC
生产子例程

  • call:raiseerror 321
    重要as
  • fc/B“%~1”“%~2”>NUL 2>&1
    将错误消息输出到
    NUL
    ,因为错误级别很重要
  • if%errorlevel%eq 0(
    • echo del“%~1”
      a文件删除仅出于调试目的
  • )其他(
    • echo%errorlevel%%“%~2”
      用于调试目的(见下文)
  • goto:eof
    从子例程返回
FC
将设置
ErrorLevel
,如下所示(但请参见
调用:raiseerror 321
点的注释):


如果相同意味着:在各个方面,不仅在日期和大小上,因此强制进行二进制比较

@ECHO OFF >NUL
SETLOCAL enableextensions
pushd "D:\bat\FooBar"
for /F "delims=" %%G in ('dir /B /A:-D *.*') do (
  call :proFC "%%~fG" "D:\bat\FooFoo\%%~nxG"
)
popd
ENDLOCAL
goto :eof

:raiseerror
exit /B %1

:proFC
  call :raiseerror 321
  fc /B "%~1" "%~2" >NUL 2>&1
  if %errorlevel% EQU 0 (
    echo del "%~1"
  ) else (
    echo %errorlevel% "%~2"
  )
goto :eof
评论了上述脚本中的关键点:

  • pushd…
    切换当前工作目录
  • for/F…
    循环处理Bar文件夹的静态文件列表
    • 调用:proFC…
      并正确引用
  • popd
    将当前工作目录切换回
  • goto:eof
    结束脚本
:raiseerror
子例程通过
退出/B%1返回退出代码

:proFC
生产子例程

  • call:raiseerror 321
    重要as
  • fc/B“%~1”“%~2”>NUL 2>&1
    将错误消息输出到
    NUL
    ,因为错误级别很重要
  • if%errorlevel%eq 0(
    • echo del“%~1”
      a文件删除仅出于调试目的
  • )其他(
    • echo%errorlevel%%“%~2”
      用于调试目的(见下文)
  • goto:eof
    从子例程返回
FC
将设置
ErrorLevel
,如下所示(但请参见
调用:raiseerror 321
点的注释):


使用批处理文件执行此操作的简单方法是编写Powershell脚本并从批处理文件调用它。您是指
批处理文件
还是
命令行
?可以从命令行执行的批处理文件或一行程序都可以。使用批处理文件执行此操作的简单方法是编写Powershell脚本并从批处理文件调用它le.你是说
批处理文件
还是
命令行
?我可以从命令行使用批处理文件或一行程序都可以。谢谢,但我尝试运行脚本,它似乎删除了不重复的文件,而不是那些重复的文件。将“neq”替换为“equ”并添加一个“not”在errorlevel 1使代码执行我想要的操作之前,谢谢。使用
echo hello>c:\bar\diff&echo world>c:\foo\diff
您的脚本可能会删除明显不同的文件(在
true
branch中为假阳性:虽然时间、日期和大小相同,但内容不同)通过
echo hello>c:\bar\noex&del c:\foo\noex
(在
else
branch:errorlevel 2中为假阳性)Oops,现在我在
else
branch中看不到假阳性!真是罪过!谢谢,但我尝试运行脚本,它似乎删除了不重复的文件,而不是那些重复的文件。将“neq”替换为“eq”在errorlevel 1之前添加一个“not”可以让代码实现我想要的功能,谢谢。使用
echo hello>c:\bar\diff&echo world>c:\foo\diff
脚本可能会删除明显不同的文件(在
true
branch中为假阳性:虽然时间、日期和大小相同,但内容不同)通过
echo hello>c:\bar\noex&del c:\foo\noex
(在
else
branch:errorlevel 2中为假阳性)Oops,现在我在
else
branch中看不到假阳性!真是罪过!