Board logo

标题: [文件操作] [已解决]批处理如何实现循环监控指定文件是否发生改变并将改变后的文件备份到指定目录 [打印本页]

作者: junili    时间: 2016-4-27 22:57     标题: [已解决]批处理如何实现循环监控指定文件是否发生改变并将改变后的文件备份到指定目录

本帖最后由 pcl_test 于 2016-4-29 01:05 编辑

如题,altrun的配置文件最近老是丢失,如果做成定期备份的话即占用大量空间又造成大量的无用文件。
我的设想是这样的:循环检测这个配置文件的大小(或者是日期、MD5、SHA-1等),与上次的结果(最后一次的变化量)进行比较,如相同,跳到程序循环检测入口继续检测;如不同,自动执行“文件名+日期”复制到指定目录进行备份。
作者: Nsqs    时间: 2016-4-28 02:02

本帖最后由 Nsqs 于 2016-4-28 02:41 编辑
  1. dim s(1):set fso=CreateObject("scripting.filesystemobject")
  2. file="1.txt" '处理文件路径
  3. path="d:\abc\" '复制路径
  4. if right(path,1)<>"\" then _
  5. path=path&"\"
  6. s(0)=fso.opentextfile(file).readall
  7. do:if not fso.folderexists(path) then _
  8. fso.createfolder path
  9. read=fso.opentextfile(file).readall
  10. if StrComp(read,s(0)) then _
  11. fso.copyfile file,path&file&"_"&dv&"."&fso.getextensionname(file):_
  12. s(1)=read:s(0)=read '数据发生改变
  13. wsh.sleep 1E+3:loop
  14. function dv '格式化时间
  15. dim y,m,d
  16. y=year(date):m=month(date):d=day(date)
  17. dv=y _
  18. &(100+m) \10 mod 10 & (100+m) mod 10 _
  19. &(100+d) \10 mod 10 & (100+d) mod 10
  20. end function
复制代码
每秒检测,退出用任务管理器结束,保存vbs文件
作者: codegay    时间: 2016-4-28 04:14

有种技术叫版本控制,VCS,GIT。。。
部分网盘带版本管理功能,比如Dropbox

以及一些一自动备份软件支持增量备份。
作者: junili    时间: 2016-4-28 08:56

回复 2# Nsqs


    感谢大神指教,可以用bat批处理实现吗?
这么晚还在熬夜,辛苦了!
作者: WHY    时间: 2016-4-28 09:23

用 wmi 事件监控
  1. strSrcFile = "E:\test\a.txt"
  2. strDstDir = "E:\Backup"
  3. Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
  4. Set colEvents = objWMI.ExecNotificationQuery _
  5.     ("select * from __InstanceModificationEvent within 5 where " _
  6.     & "TargetInstance ISA 'CIM_DataFile' and TargetInstance.Name='" & Replace(strSrcFile, "\", "\\") & "'")
  7. While True
  8.     Set objEvent = colEvents.NextEvent
  9.     strNewFile = strDstDir & "\" & objEvent.TargetInstance.LastModified & ".txt"
  10.     objEvent.TargetInstance.Copy strNewFile
  11. Wend
复制代码

作者: junili    时间: 2016-4-28 13:15

回复 5# WHY


    这个也是VBS脚本吧!bat不能实现吗?
作者: WHY    时间: 2016-4-28 15:35

  1. @echo off
  2. set "f=E:\Test\a.txt"
  3. for /f %%i in ('wmic datafile where "Name='%f:\=\\%'" get LastModified^|findstr [0-9]') do set "t1=%%i"
  4. :Loop
  5. >nul ping 127.0.1 -n 5
  6. for /f %%i in ('wmic datafile where "Name='%f:\=\\%'" get LastModified^|findstr [0-9]') do set "t2=%%i"
  7. if not "%t1%" == "%t2%" copy "%f%" "E:\Backup\%t2%.txt"
  8. set "t1=%t2%"
  9. goto :Loop
复制代码

作者: Nsqs    时间: 2016-4-28 16:42

本帖最后由 Nsqs 于 2016-4-28 17:18 编辑
  1. @echo off
  2. set "file=1.txt"
  3. copy %file% tmp>nul
  4. set "p=d:\abc"
  5. if not %p:~-1%==\ set p=%p%\
  6. :loop
  7. set t=%time:~,2%%time:~3,2%%time:~6,2%&call set f=%%file:.=_%t%.%%
  8. cls&fc /b %file% tmp>nul 2>nul && echo 数据没有任何改动||(
  9. (copy %file% tmp
  10. if not exist %p% md %p%
  11. copy %file% %p%%f%)>nul
  12. echo 数据发生改变)
  13. for /l %%1 in (1 1 12000)do (. 2>nul)
  14. goto loop
复制代码
回复 6# junili

每1秒检测一次
作者: junili    时间: 2016-4-28 23:43

回复 8# Nsqs


    大神,您的脚本太高深了,我这种小白根本无法读懂,还是采用7楼(WHY)的答案吧,简单些,方便我后期修改使用。不好意思哦!
作者: junili    时间: 2016-4-28 23:45

回复 7# WHY


    感谢在百忙之中帮助我等小白,解惑。真的十分感谢!
作者: Nsqs    时间: 2016-4-29 00:43

回复 9# junili


    他的代码效率极低,调用太多外部程序了
作者: WHY    时间: 2016-4-29 11:07

to 楼上

好好贴你的代码就可以了,以你目前的批处理水平,评论别人的代码,你还不够格。
作者: codegay    时间: 2016-4-29 12:02

喷别人性能不好技能 +1
批处理性能这么差,用个屁批处理。
作者: Nsqs    时间: 2016-4-29 14:05

to 楼上

好好贴你的代码就可以了,以你目前的批处理水平,评论别人的代码,你还不够格。
WHY 发表于 2016-4-29 11:07



    逗,你的代码在for里调用wmi和find 除了bat本身循环,还不包括第三方多次循环。或者,你这么优越感那就秀一秀你的技术?我是跟别人说话。再者你那么高调的说我技术烂的话。说话之前最好掂量一下自己,小心打脸。
作者: WHY    时间: 2016-4-29 17:01

to 楼上

卧槽,自以为是的是你,说话高调的是你,被你反咬一口。。。

楼主所要求的是一个无限循环的功能,也就是不考虑开始时间和结束时间的死循环。
这种情况下你还考虑神马效率高不高?
你的代码效率高,1秒钟能复制一个文件;我的代码效率低,1秒钟复制不了一个文件?

这种情况下更应该关注的是资源占用率和代码兼容性。
假设你说的是代码兼容性如何如何,我不会有异议,或许还可能给你点个赞
作者: Nsqs    时间: 2016-4-29 17:43

回复 15# WHY


    就事论事,我发现你很喜欢纠结,我是跟楼主说话也没有回复你,占资源的话你的程序会更夸张吧?你自己看看进程每次启动findstr和wmi ping cpu会暴涨最少20-30%左右
而且你在返回值上每次得到结果都会慢半拍,楼主也说了.举个典型的例子就是,当你要解决一个问题的时候要求不能过午夜12点,因为速度慢半拍而发生问题.
你再看看我的代码里有ping 等外部程序么? 你说我自以为是你还是管好自己吧,我的都没搭理你,上来一句喷人,到底是谁自以为是我就呵呵了
作者: CrLf    时间: 2016-4-29 20:01

罔谈彼短,靡侍己长,不同角度有不一样的风景
以我的经验,目测两种方案各有占资源的部分,前者是因为调用wmic,后者是因为对延时的实现
而且楼主都结帖了,再为哪个方案好而吵架这不是太搞笑了吗?
作者: WHY    时间: 2016-5-2 16:45

to #16

1.我不“就事论事”,我难道想跟你扯犊子?

2.你跟楼主说话和我没有关系,你扯上我做神马?我认识你?“他的代码效率极低”,你扯效率做神马?楼主都能用,你测试过不能用?假设我也回复楼主:“那2B在胡说八道”,你不许生气。

3.资源占用高我当然承认,假设一开始你就拿这个说事,那我还真对你刮目相看。

4.楼主什么时候提过慢半拍的事情了?写代码尽可能考虑周全没有错,但也得具体问题具体分析吧?神马都想要考虑到,那我劝你别学批处理了。

5.你没有用“ping等外部命令”,因为你认为 fc 是内部命令,因为你认为用了外部命令效率就一定低。

6.真正的高手不仅水平了得,而且谦虚谨慎、与世无争。本人只是一批处理菜鸟,从不认为自己比谁水平高。至于你,把你归到“高手”之列,你嫌不嫌臊得慌?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2