求一复制的批处理 : 从A文件夹复制文件到B文件夹,如果文件名相同,大小相同,则覆盖, 如果文件名相同,大小不

2024-12-18 11:10:49
推荐回答(2个)
回答1:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
REM 若准备留存为一个批处理,以后通过传入参数的方式运行,则不必修改
REM 若仅为一次性的处理,亦可将下面两句分别改为SET SourceDir=A和SET SourceDir=B
SET SourceDir=%~f1
SET TargetDir=%~f2

REM 判断参数是否合格,不合格的予以提示后退出
IF "%TargetDir%"=="" GOTO ShowUsage

REM 开始真正的活儿...
PUSHD "%SourceDir%"
FOR /F "UseBackQ Delims=" %%F IN (`DIR /B /A-D /ON`) DO (
ECHO -- %%F
SET SourceSize=%%~zF
IF EXIST %TargetDir%\%%F (
REM 文件名相同,详细处置...
FOR %%K IN (%TargetDir%\%%F) DO (
IF !SourceSize! EQU %%~zK(
REM 文件名与大小均相同,覆盖之...
COPY /Y %%F %TargetDir%>NUL
) ELSE (
REM 名同大小异,更名复制;最多同名一千个,应该不会超出吧...
REM 如果确保文件同名的机会更少,可将下面的999改得小一些,以提高处理速度
SET /A FileOrder=1
FOR /L %%I IN (1,1,999) DO (
SET NewName=%%~nF^(!FileOrder!^)%%~xF
IF EXIST %TargetDir%\!NewName! (
FOR %%X IN (%TargetDir%\!NewName!) DO (
REM 看看带有(N)的文件是否与原文件大小相同,如相同,则覆盖,否则才递增N
IF !SourceSize! NEQ %%~zX SET /A FileOrder+=1
)
)
)
COPY /Y %%F %TargetDir%\!NewName!>NUL
)
)
) ELSE (
REM 文件名不同,径直复制...
COPY %%F %TargetDir%>NUL
)
)
POPD
GOTO End

:ShowUsage
ECHO 用法:%~n0 原始路径 目标路径>&2
ECHO 说明:路径尾部不要带\,如“D:\MyData”合格,“F:\MyData\”不合格>&2
GOTO End

:End
ENDLOCAL

回答2:

强烈建议 用au3做 批处理比较文件大小也太蛋疼了吧

写个au3脚本源代码给你 先写个复制单个文件的 想要更复杂功能请留下邮箱

; 复制 d:\abc\fgh.txt 到 d:\xyz

If Not FileExists("d:\xyz\fgh.txt") Then
FileCopy("d:\abc\fgh.txt","d:\xyz")
Else
If FileGetSize("d:\abc\fgh.txt") = FileGetSize("d:\xyz\fgh.txt") Then
FileCopy("d:\abc\fgh.txt","d:\xyz",1)
Else
$i = 1
While FileExists("d:\xyz\fgh("&$i&").txt")
$i += 1
WEnd
FileCopy("d:\abc\fgh.txt","d:\xyz\fgh("&$i&").txt")
EndIf
EndIf