[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
啊,你这6月份的是上次或者上上次或者上上上次镜像得来的吧
最简单办法:镜像前清空目标文件夹所有?

TOP

本帖最后由 aloha20200628 于 2024-9-10 23:30 编辑

回复 1# onging

有必要澄清一下采用 /mir 完成镜像备份的基本含义 》
   运行
   robocopy D:\源文件夹 D:\目标文件夹 /mir
   的结果
是确保 ‘目标文件夹(或称 ‘到达文件夹’ 或 ‘目的地文件夹’)与源文件夹的结构及内容完全相同’,其运行结果还会 ‘删除目标文件夹存在但源文件夹不存在的内容(目录和文件)’,其中参数 /mir 的作用等同于组合参数 /purge /e,这是采用 /mir 完成两个文件夹之间镜像备份的真正含义,因此,额外附加参数 /maxage 或 /minage 对于镜像备份的操作均无意义...

TOP

回复 25# onging

批处理脚本位于共享文件夹中是无法cd 到 脚本所在目录的.
  1. @echo off
  2. rem 保存为ansi编码
  3. @REM cd /d "%~dp0" & REM 共享文件夹不支持 cd 切换当前路径
  4. echo CD="%cd%"
  5. @REM 镜像来源文件夹
  6. set fd_from=\\pgy8\F
  7. @REM 镜像目标文件夹
  8. set fd_to=G:\新建文件夹
  9. for %%a in (0.e 30.s) do (
  10. for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
  11. set %%~xa=%%i
  12. )
  13. )
  14. for /f "delims=" %%d in ('dir /b /ad "%fd_from%\*" ^| findstr /rxc:"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]"') do (
  15. if "%%d" geq "%.s%" (
  16. if "%%d" leq "%.e%" (
  17. robocopy "%fd_from%\%%d" "%fd_to%\%%d" /S /PURGE
  18. )
  19. )
  20. )
  21. pause
复制代码
用 /S /PURGE代替/MIR
1

评分人数

    • 77七: 感谢分享技术 + 1
微信:flashercs
QQ:49908356

TOP

回复 22# onging


    /mir 已经包含 /purge了。命令行不需要再添加了。
许多空文件夹的存在,你要先去看看,源文件夹是不是也有。
mir的清理功能,只能删除是源文件夹上没有,而目标文件夹还存在的。不是根据时间限制来清理的。
mir最终是达到1:1备份,/maxage 只能限制文件,对文件夹无效, /s 针对文件夹,复制包括子文件夹,但不复制空文件夹

综上,你的情况和目的到现在都没有表达清除。我只能靠猜测了
首先,你要是在空白的新目标文件夹下备份,就用下面的命令即可。这个时候,存在的文件和文件夹都是30天内的。
  1. robocopy "d:\源文件夹"  "e:\目标文件夹" /mir /s /maxage:30
复制代码
然后,如果你是在旧的备份目标文件夹下再次备份,那就需要多一条命令。用于清除过时的空文件夹。
当然,这个目标文件夹下除了上面的30天内的文件和文件夹,可能还存在一些过时的文件和非空文件夹,比如6月的,这个就是源文件夹下依然存在,所以/mir 给与保留的。
  1. @echo off
  2. set "fd=e:\目标文件夹"
  3. for /f "delims=" %%d in ('dir /b /s /ad "%fd%" ^| sort /r') do rd "%%d"
  4. pause
复制代码

TOP

本帖最后由 77七 于 2024-9-10 22:08 编辑

回复 25# onging


   
试试通过robocopy /create 达到映射效果,再比较后从源目录复制

  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. set fd_from=d:\新建文件夹
  5. set fd_to=g:\新建文件夹
  6. set fd_tmp=f.f
  7. robocopy "%fd_from%" "%fd_tmp%" /create /lev:2 /e
  8. for %%a in (0.s 30.e) do (
  9.         for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
  10.                 set %%~xa=%%i
  11.         )
  12. )
  13. pushd "%fd_tmp%"
  14. for /f "delims=" %%d in ('dir /b /ad ^| findstr /rxc:"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]"') do (
  15.         if "%%d" geq "%.s%" (
  16.                 if "%%d" leq "%.e%" (
  17.                         robocopy "%fd_from%\%%d" "%fd_to%\%%d" /mir
  18.                 )
  19.         )
  20. )
  21. popd
  22. rem rd /s /q "%fd_tmp%"
  23. pause
复制代码
代码错误,此楼和21楼,我把开始日期和截止日期写反了,参考28楼大佬写的。
bat小白,请多指教!谢谢!

TOP

回复 24# 77七
不好意思,又不支持目录

TOP

回复 23# onging


   第3行
  1. cd /d "D:\新建文件夹\新建文件夹"
复制代码
bat小白,请多指教!谢谢!

TOP

回复  onging
77七 发表于 2024-9-10 18:05

目标文件是“G:\新建文件夹”这里吧,原文件夹在那里填入呢?

TOP

回复 20# ppll2030
robocopy D:\新建文件夹\新建文件夹 D:\新建文件夹+ /mir /s /PURGE /maxage:30
是这样写吗,但还是有很多空白文件夹,如下图:

TOP

回复 18# onging


  
  1. @echo off
  2. rem 保存为ansi编码
  3. cd /d "%~dp0"
  4. for %%a in (0.s 30.e) do (
  5. for /f "delims=" %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%%~na) -uformat "%%Y-%%m-%%d""') do (
  6. set %%~xa=%%i
  7. )
  8. )
  9. for /f "delims=" %%d in ('dir /b /ad ^| findstr /rxc:"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]"') do (
  10. if "%%d" geq "%.s%" (
  11. if "%%d" leq "%.e%" (
  12. robocopy "%%d" "G:\新建文件夹\%%d" /mir
  13. )
  14. )
  15. )
  16. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 19# onging


    看题不认真。那是相当累的啊 15楼都告诉你了。在你的命令后面再添加 /s 的参数即可。

TOP

回复 17# ppll2030
怎么跟我那段连接起来使用呢

TOP

回复 16# 77七
这个不用创建日期,能把代码写全吗

TOP

回复 15# ppll2030


    在补充一点,/maxage 的时间限制,只是针对为即将要备份的文件,
目标文件夹内已经存在的文件,比如6月份备份的,再次/mir ,只要源文件夹还有,目标文件夹也不会清除。
这就是所谓的镜像,/mir 你有我也有 ,你不要我也不要。
你有新的但我只要一部分,那就加码提要求 /maxage /minage /s  

TOP

回复 14# onging


   测试 /mir 日志
  1.       选项: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30
复制代码

测试 /e /purge 日志
  1.       选项: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /R:1000000 /W:30
复制代码

它们实际执行是相同的。

如果以楼主的文件夹命名方式(创建日期?),备份名称为30天内的文件夹,要利用 robocopy 的多线程速度优势,可以先用for筛选出符合条件的文件夹,再单个robocopy。
bat小白,请多指教!谢谢!

TOP

返回列表