Это может быть больше, чем вам нужно, но при правильной настройке это должно сделать работу.
Я провел некоторые эксперименты, и кажется, что если вы используете xcopy с параметром /D и указываете имя файла назначения, вы получите копию, независимо от того, совпадают ли эти файлы или нет. (Похоже, что оно основано на сравнении с целевым именем файла вместо исходного.)
Поэтому я использовал xcopy только для сравнения, а не для копирования. (Спасибо Селби за предложение опции /L.)
Это кажется довольно большим, но если вы удалите комментарии, это довольно мало. Этот пример копирует и переименовывает файлы, которые существуют в месте назначения, но являются более новыми, используя текущую дату и время. Он копирует, но не переименовывает файлы, которые не существуют в месте назначения (могут быть легко изменены). И не копирует файлы, которые одинаковы.
Я могу помочь вам изменить его в соответствии с вашими потребностями.
@ECHO OFF
REM ### Note that this assumes all filenames end with ".txt". This can be changed to suit your needs ###
REM ### Needed so the variables will expand properly within the FOR DO loops ###
Setlocal EnableDelayedExpansion
REM ### Set the source file(s) and call the "CopyIt" subroutine ###
SET Sourcefile=Test 1.txt
CALL :CopyIt
SET Sourcefile=Test2.txt
CALL :CopyIt
REM ### End of the program. Otherwise the subroutine will run again ###
REM ### You can also just put an "EXIT" command here ###
GOTO END
REM ### The subroutine ###
:CopyIt
REM ### Set the date and time to a variable called "DaTime" and remove offending ###
REM ### characters (/ and :) that can't be used in a filename ###
FOR /f "tokens=1-4 delims=/ " %%a in ("!date!") do SET DaTime=%%b-%%c-%%d
FOR /f "tokens=1-3 delims=':'" %%e in ("!time!") do SET DaTime=!DaTime!_%%e-%%f-%%g
REM ### Set a variable called "DestFile" to source filename minus ".txt" ###
REM ### to be used to set the new destination file name + "DaTime" ###
SET Destfile=!Sourcefile:.txt=!
REM ### Check to see if the source filename exists in the destination directory ###
DIR "C:\_Dest\!Sourcefile!" > NUL
IF !ErrorLevel!==0 (
REM ### If it does exist, set the loop count to 0 ###
SET /a Count=0
REM ### Have xcopy check to see if the source file is newer, but only report and not copy ###
REM ### Thanks to selbie for suggesting the /L option ###
FOR /f "tokens=1 delims=0" %%s in ('xcopy /Y /D /L "C:\_Source\!Sourcefile!" "C:\_Dest\"') DO (
REM ### Increment the loop count ###
SET /a Count=!Count!+1
REM ### Only pick up the first iteration. If the files are different, it will be the full path and the filename ###
If !Count!==1 SET Source=%%s
)
REM ### If the source is the same as the destination, then !Source! will = " File(s)". Change it to NONE ###
SET Source=!Source: File^(s^)=NONE!
REM ### If it's not equal to NONE, copy the file and rename it to source file + date & time + .txt ###
IF !Source! NEQ NONE COPY /Y "!Source!" "C:\_Dest\!Destfile!-!DaTime!.txt"
) ELSE (
REM ### If it does not exist, copy the file without renaming it ###
COPY /Y "C:\_Source\!Sourcefile!" "C:\_Dest\"
)
REM ### Exit the subroutine ###
EXIT /b
:END
pause