Batch file 使用Windows命令行删除重复文件
给定两个目录c:\foo和c:\bar,我想删除c:\bar中与c:\foo中存在的文件相同的文件。我可以使用fc命令将c:\bar中的每个文件与c:\foo中同名的文件进行比较,并手动删除重复的文件。有没有一种简单的方法可以使用CMD自动执行此操作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
@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…
循环处理Bar文件夹的静态文件列表for/F…
并正确引用调用: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中看不到假阳性!真是罪过!