[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理如何判断文件修改日期并移动到某空间?

求助各位老师,本人在公司里做运维,因服务器硬盘空间所限,所以把数据库备份放在3个空间,本机G:\Data_cope\,是数据每天自动备份,本机I:\SQL_DB_BAK\,是另外一个存储的空间,局域网共享\\192.168.163.2\可写入\oa_db_bak\是第三个可写入共享空间。
举个例比如今天是20号,局域网可以保留13天的数据,本机I盘可以保留6天,本机G盘可以保留6天.程序先比较局域网共享的备份文件,如果超过25天的数据会删除,再去比较I盘,如果超过12天的移动到局域网共享空间,最后去比较G盘,如果超过6天会移动到I盘。代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. ::设置服务器绝对路径。
  3. set services=\\192.168.163.2\可写入\oa_db_bak\
  4. ::设置日常数据库备份路径。
  5. set dbbak=G:\Data_cope\
  6. ::设置临时存储数据库路径。
  7. set linshi=I:\SQL_DB_BAK\
  8. ::设置日志路径。
  9. set logtxt=\\192.168.163.2\可写入\log\
  10. ::设置瑞星杀毒服务器(192.168.163.2)数据库保留的天数
  11. set DaysAgo=25
  12. ::设置临时存储(I盘)数据库保留的天数。
  13. set DaysAgo1=12
  14. ::设置日常数据库(G盘)备份保留的天数。
  15. set DaysAgo2=6
  16. ::获取当前日期字符串(d为年月日,t为时分秒,dt为年月日时分秒)。
  17. for /f "tokens=1,2,3 delims=/- " %%a in ("%date%") do @set D=%%a-%%b-%%c
  18. rem echo 获取当前时间字符串
  19. for /f "tokens=1,2,3 delims=:." %%a in ("%time%") do @set T=%%a:%%b:%%c
  20. rem echo 如当前小时小于10,将空格替换为0
  21. set T=%T: =0%
  22. set dt=%D% %T%
  23. ::计算离今天相差“DaysAgo”之前的日期。
  24. >"%temp%\MyDate.vbs" echo LastDate=date()-%DaysAgo%
  25. >>"%temp%\MyDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day
  26. (LastDate),2)
  27. >>"%temp%\MyDate.vbs" echo wscript.echo FmtDate
  28. for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do (
  29.     set DstDate=%%a
  30. )
  31. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  32. echo %DaysAgo%天之前的日期是:%DstDate%。
  33. echo 正在删除%DstDate%之前的备份数据库..
  34. for /r "%services%" %%i in (*) do (
  35. set str=%%~ti
  36. set str=!str:~0,10!
  37. ::str为获取指定文件的修改日期。
  38. if !str! LEQ %DstDate% del "%%i"
  39. )
  40. echo 机房服务器超过%DaysAgo%天之前在%dt%已经删除。|>>"%logtxt%%d%.txt"
  41. echo 机房服务器超过%DaysAgo%天之前在%dt%已经删除。
  42. echo 正在处理本机I盘数据库备份文件。
  43. ::计算离今天与%DaysAgo1%之前的日期。
  44. >"%temp%\MyDate.vbs" echo LastDate=date()-%DaysAgo1%
  45. >>"%temp%\MyDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day
  46. (LastDate),2)
  47. >>"%temp%\MyDate.vbs" echo wscript.echo FmtDate
  48. for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do (
  49.     set DstDate=%%a
  50. )
  51. set DstDate1=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  52. echo %DaysAgo1%天之前的日期是:%DstDate1%。
  53. for /r "%linshi%" %%j in (*) do (
  54. set str=%%~ti
  55. set str=!str:~0,10!
  56. ::str为获取指定文件的修改日期。
  57. if !str! LEQ %DstDate1% move "%%j" "%services%"
  58. )
  59. echo 本机I盘数据库备份超过%DaysAgo1%天之前在%dt%已经移动到%services%。|>>"%logtxt%%d%.txt"
  60. echo 本机I盘数据库备份超过%DaysAgo1%天之前在%dt%已经移动到%services%。
  61. pause
  62. echo 正在处理本机G盘数据库备份文件。
  63. ::计算离今天与%DaysAgo2%之前的日期。
  64. >"%temp%\MyDate.vbs" echo LastDate=date()-%DaysAgo2%
  65. >>"%temp%\MyDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day
  66. (LastDate),2)
  67. >>"%temp%\MyDate.vbs" echo wscript.echo FmtDate
  68. for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do (
  69.     set DstDate=%%a
  70. )
  71. set DstDate2=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  72. echo %DaysAgo2%天之前的日期是:%DstDate2%。
  73. for /r "%dbbak%" %%k in (*) do (
  74. set str=%%~ti
  75. set str=!str:~0,10!
  76. ::str为获取指定文件的修改日期。
  77. if !str! LEQ %DaysAgo2% move "%%k" "%linshi%"
  78. )
  79. echo 本机G盘数据库备份超过%DaysAgo2%天之前在%dt%已经移动到%linshi%。|>>"%logtxt%%d%.txt"
  80. echo 本机G盘数据库备份超过%DaysAgo2%天之前在%dt%已经移动到%linshi%。
复制代码
现在问题来了,
1.增加一个功能,比如程序比较文件时先PING一个局域网共享IP,如果不通,刚在本机某个目录记录哪个时间不通。如果通就执行文件移动操作。
2.获取的时间在移动后都是一样,这个应该在哪里增加,让代码结果显示哪个时间完成操作的?
3.不想代码太过冗长,所以哪里有简短代码的地方?
土土土土土土土土土土土

如果你的系统里面有 forfiles 命令,可以参考方案5
http://bbs.bathome.net/thread-3334-1-1.html

这样就不必动态生成vbs来计算日期了,可以大大缩短代码行数。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表