这是一个关于批处理关于遍历的脚本问题,求大神解决?

我现在要实现一个功能,要求使用bat批处理脚本实现。
要求:
1. 在不同的路径有两个目录例如:d:/aa 和d:/bb
1. aa目录要和bb目录进行一个遍历对比,相同的目录和相同的文件进行备份到d:/cc目录(按照同样的目录树结构),不同的目录和文件不做处理。这里需要注意的是,windos下的目录名和文件名可能中间有空格,也要进行备份。遍历时,这个会出现问题。主要是处理这个问题。
1. 备份完毕时,将d:/aa覆盖d:/bb目录。


以下是代码,代码存在的问题是遍历目录太慢,备份太耗时。
echo off & color 0A
:: backup module
set datet=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%
set "datet=%datet: =0%"

md %4\%1\%datet%
set sDIR=%2\%1
set dDIR=%3\%1
set bakDir=%4\%1\%datet%
echo :: 功能:项目上线部署文件备份
echo :: 介绍:使用最新项目文件与生产环境进行比较,对需要更新的文件进行备份操作。
echo :: 执行示例:jen_deploy 133-www.wyf.com D:\workspace D:\webfile D:\webfilesbak
echo :: 源文件夹: %sDIR%
echo :: 目标文件夹: %dDIR%
echo :: 备份文件夹: %bakDir%
echo :: 上线时间:%datet%
:: -------------------------------------------------------------
::--定义源、目标、备份文件夹
::--定义4个传数,%1:项目名 %2:源文件夹,%3:目标文件夹,%4:备份文件夹
::--定义项目名、源、目标、备份文件夹项目名.
if exist %3\%1 (
echo.目录名存在,开始执行操作
) else (
echo.目录名不存在,新建目录中....
md %3\%1
)
setlocal ENABLEDELAYEDEXPANSION ::开启环境变量扩展 特别重要
set varD=test
set varD2=test
set varS=test
set varS2=test
set varS3=test
:: 遍历源文件夹及子文件夹,并与目标文件夹的文件进行比较,对相同的文件进行备份操作。
for /R %sDIR% %%f in (*) do (
set varS=%%f
set varS2=!varS:%2\%1=!
rem echo 1: sDir=%sDir% : varS=!varS! : varS2= !varS2!
call :copyFunc %3\%1
rem echo %2
)
endlocal
echo :: 备份完成,正在上线。
::on-line module
xcopy %sDIR% %dDIR%\% /y /E /v
echo :: 上线完成

:copyFunc
for /R %dDIR% %%h in (*) do (
set varD=%%h
set varD2=!varD:%1=!
rem echo 2: dDir=%dDir% : varD=!varD! : varD2= !varD2!
if !varD2!==!varS2! (
FOR /F "delims==" %%i IN ("%bakDir%!varD2!") DO (
set varS3=%%~di%%~pi
)
rem echo print --- "%%h" "!varS3!"
xcopy "%%h" "!varS3!" /y /v
rem echo xcopy "%%h" "!varS3!" /y >>log.txt
exit /b
rem echo Backup file : %%h

) else (
rem echo No have Backup flie!
)
)
goto :eof

2个回答

setlocal ENABLEDELAYEDEXPANSION ::去掉这个即可

把你的代码贴出来看看,哪有问题改哪里!

qq_42399778
敲下一段感悟 代码贴出来了
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!