批处理脚本来制作备份文件夹.仅新文件和修改的文件



我需要一个脚本来仅将更改/修改的文件和新文件从我的C:\Dropbox复制到我的C:\backup。为什么这只复制文件夹结构:

@echo off
set destination=C:Backup
set source=C:UsersXXXXDropboxIntranet
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd1=%%j"."%%i"."%%k
xcopy %source%"*" %destination%"*" /m/e/y
mkdir %destination%"LastBackupDate %yyyymmdd1%"
echo A folder containing the latest date has been created in root directory of %source%.
echo Finished copying %source% to %destination%
echo.
pause
ECHO OFF
set source=C:UsersxxxxDropbox
set destination=C:Backup
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd1=%%j"."%%i"."%%k
if exist %destination% goto GO
:GO
mkdir %destination%%yyyymmdd1%
xcopy %source%* %destination% /s/d/y/c/v/r
echo. 
echo Finished copying %source% to %destination%
echo.
echo Created %destination%%yyyymmdd1%
pause

这是一个通用的备份脚本。

@echo off
REM get start time
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
REM set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
set "logtimestamp=%YYYY%.%MM%.%DD% %HH%:%Min%:%Sec%"
REM actual copy
set source=%1
set destination=%2
REM create the exclusion list
set exclusion=%3
set exclusion=%exclusion:"=%
(for %%i in (%exclusion%) do echo %%i) > exclusion.txt
REM set the file name for the logging data
set log=log-%fullstamp%.txt
REM start the backup process
echo // started backup at %logtimestamp% > %log%
echo // from %~f1 to %~f2 >> %log%
echo ---- >> %log%
xcopy %source% %destination% /S /E /C /D /H /R /Y /V /I /EXCLUDE:exclusion.txt >> %log%
echo ---- >> %log%
del /f exclusion.txt
REM get finish time
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "logtimestamp=%YYYY%.%MM%.%DD% %HH%:%Min%:%Sec%"
echo // finished backup at %logtimestamp% >> %log%
REM move the logging
if not exist "%destination%.backup_log" mkdir %destination%.backup_log
move %log% %destination%.backup_log

假设批处理脚本称为备份,我将如何调用它.bat:

backup.bat MyFolder h:MyFolder .metadata

其中MyFolder的内容被备份到h:\MyFolder,所有名为".metadata"的文件夹都被忽略。文件夹 '我的文件夹' 在 h:\如果驱动器尚不可用,则会创建驱动器。

此脚本的功能:

  • 创建所有必要的文件夹
  • 复制自上次备份以来修改过的所有文件
  • 创建一个文件夹,用于在目标文件夹内进行日志记录,名为:.backup_log
  • 创建一个日志文件,其中包含 xcopy 运行时的所有信息以及开始和停止时间的时间戳。

更新:如果没有排除列表,请将"作为第三个参数。

回答原始问题,为什么您的脚本只复制文件夹结构...

这是由于 xcopy 上的参数,您只指定了这些/m/e/y:

/M = 仅复制设置了存档属性的文件,关闭存档属性。

/E = 复制目录和子目录,包括空目录和子目录。

/Y = 禁止确认。

请注意,正如之前给出的答案,只需添加/D 并删除/M 即可解决问题,请检查帮助对/D 的看法:

/D:m-d-y 复制在指定日期当天或之后更改的文件。 如果未给出日期,则仅复制那些 源时间比目标时间新。

如果您需要在一次运行中备份多个文件夹并有一个包含其执行的日志文件,则可以具有如下所示的内容:

@echo off
call:backUpFolder "C:UsersXXXfolder1" "C:Backupfolder1"
call:backUpFolder "C:UsersXXXfolder2" "C:Backupfolder2"
call:backUpFolder "C:UsersXXXfolder3" "C:Backupfolder3"
goto:eof
::--------------------------------------------------
::-- This is the function to back up one folder
::--------------------------------------------------
:backUpFolder
set source="%~1"
set destination="%~2"
echo copying from %source% to %destination%
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
xcopy %source%"*" %destination%"*" /s/d/y/c/v/r
echo %ldt%: %source% to %destination% >> backHistory.log
echo Finished copying %source% to %destination%
goto:eof
set "source="F:Projects""
set "destination=G:backup"
for /f "tokens=1* delims=" %%a in ('date /T') do set datestr=%%a
if not exist %destination%%datestr% (mkdir %destination%%datestr%)
for /f %%I in ('wmic os get localdatetime ^|find "20"') do set dt=%%I
set dt=%dt:~4,2%-%dt:~6,2%-%dt:~0,4%
echo %dt%
XCOPY %source% %destination%%datestr% /S /d:%dt% /Y
REM XCOPY %source% %destination%%datestr% /E /I /H /Y /S /d:%dt%
pause
"Press any key to continue . . ."

最新更新