Board logo

标题: [文件操作] [已解决]批处理如何监控某盘,一旦出现某文件,系统就会出反应 [打印本页]

作者: 福垊    时间: 2021-4-4 23:30     标题: [已解决]批处理如何监控某盘,一旦出现某文件,系统就会出反应

最近工作上,遇到一个问题。在E盘会产生一个如abc.dat格式的文件,当这个文件大到60K以上时,就会导致系统运行的主程序网断,影响数据传输。退出主程序,网络也是畅通的。
恳求各位高手,让通过批处理或者VBA实现对E盘的监控,我想实现五种任意一种,来一劳永逸地解决这一难题。
【改名】
方案一
循环监控E盘,一旦产生该文件,立即自动改名。因为该文件可能十天半月出现一次,希望能实现出现一次,改一次名,并且每次名字最好顺延。比如第一次是abc0.dat,第二次就是abc1.dat
方案二
循环监控E盘,当该文件产生到15K时,立即自动改名。以后出现一次,改一次名,每次名字顺延。
【移动】
方案三
循环监控E盘,一旦产生该文件,立即自动移动到G盘新建立的abc文件夹。以后每次出现一次,就移动一次,每次文件名顺延。
方案四
循环监控E盘,当该文件产生到15K时,立即自动移动到G盘新建立的abc文件夹。以后该文件每达到15K,就移动一次,每次文件名顺延。
【阻止】
循环监控E盘,一旦该文件出现,立即删除。或者是循环监控E盘,随时阻止该文件的出现。
万望各位大佬、高手在闲暇时,多多指教,不胜感激。
作者: binghejin    时间: 2021-4-5 11:30

@echo off
cls
if exist e:\abc.dat del /q e:\abc.dat
作者: 追梦人    时间: 2021-4-5 14:02

:start
if exist e:\abc.dat (
        del e:\abc.dat
        goto start
) else (
        rem 不存在,休息15秒,再检查
        timeout 15
        goto start
)
楼主,保存为bat后缀文件,放到启动文件夹,开机会自启动,就行了,我的启动文件夹目录是"C:\Users\xxx(用户名)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup",供你参考
作者: 福垊    时间: 2021-4-5 15:38

本帖最后由 福垊 于 2021-4-5 15:59 编辑

回复 2# binghejin
经测试,效果很好,效率很高。只是这个bat文件,删除之后,影响系统,那么能不能对它改名改名或移动呢?
再次感谢。
作者: 福垊    时间: 2021-4-5 15:39

本帖最后由 福垊 于 2021-4-5 16:03 编辑

回复 3# 追梦人
经亲测很好很强大,谢谢。请问能不能将删除改为重命名或者移动呢?因为删除该文件后,影响系统。另外是超过15K,不是15秒。
作者: 福垊    时间: 2021-4-5 16:21

本帖最后由 福垊 于 2021-4-5 16:23 编辑

@追梦人 大神,我简单修订了您的代码,来实现重命名。
:start
if exist e:\abc.dat (
         ren abc.dat abc0.dat
        goto start
) else (
        rem 不存在,休息15秒,再检查
        timeout 15
        goto start
)

可只要一出现就会顺延重命名怎么实现呢?
可如何再出现一个abc.dat,我想把它命名为abc1 .bat怎么实现。
总之,只要出现abc.dat,就立即重命名,并以此为abc1、 abc2、abc3……,这样循环下去。
作者: newgain    时间: 2021-4-5 18:16

既然可以改名 那么这个文件对于程序运行时没有影响的,直接批处理删除就好,或者自己建一个同名文件,设置只读。
作者: 福垊    时间: 2021-4-5 18:17

:start
if exist e:\abc.dat (
        ren abc.dat abc0.dat
ren abc.dat abc1.dat
ren abc.dat abc2.dat
ren abc.dat abc3.dat
ren abc.dat abc4.dat
ren abc.dat abc5.dat
ren abc.dat abc6.dat
ren abc.dat abc7.dat
ren abc.dat abc8.dat
ren abc.dat abc9.dat
ren abc.dat abc10.dat
ren abc.dat abc11.dat
ren abc.dat abc12.dat
        goto start
) else (
        rem 不存在,休息15秒,再检查
        timeout 15
        goto start
)

没有好办法,只有通过笨法来实现了。

@追梦人 @binghejin
作者: smss    时间: 2021-4-5 18:22

  1. @Echo off&SetLocal EnableDelayedExpansion&set n=0
  2. :start
  3. if exist e:\abc.dat (set /a n=+1&ren e:\abc.dat abc!n!.dat)else timeout 15
  4. goto start
复制代码

作者: 福垊    时间: 2021-4-5 18:25

回复 9# smss

大佬,产生的第一个abc.bat能修改为abc0.bat。产生第二abc.bat提示重命名冲突,而不是改为abc1.bat。还请大佬再看看,谢谢。
作者: 福垊    时间: 2021-4-5 18:25

回复 7# newgain


    有影响啊,会导致主程序网断的。
作者: newgain    时间: 2021-4-5 21:06

回复 11# 福垊那么 改名并转移到其他目录,跟删除也没区别呀

作者: newgain    时间: 2021-4-5 21:56

回复 13# qixiaobin0715会有重复文件提示

作者: newgain    时间: 2021-4-5 22:10

本帖最后由 newgain 于 2021-4-5 22:15 编辑
  1. :start
  2. @echo off
  3. if exist e:\abc.dat (
  4.         ren "e:\abc.dat" "abc1.dat"
  5.       >nul 2>nul del /s /q e:\abc1.dat
  6.     ) else (
  7.         echo 未找到文件,15秒后继续
  8.         timeout 15
  9.     )
  10. cls
  11. goto start
复制代码


先改名为abc1,后删除,测试没问题. 至于你说到改名为1 2 3,实力不允许,搞不定。
作者: newgain    时间: 2021-4-5 23:27

本帖最后由 newgain 于 2021-4-6 01:18 编辑
  1. :start
  2. @echo off
  3. set ntime=%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
  4. for /f "delims=" %%i in ("e:\abc.dat") do (
  5. if %%~zi geq 15360 (
  6.            move e:\abc.dat g:\abc\"%ntime%.dat"
  7.      ) else (
  8.         timeout 15
  9.     ))
  10. cls
  11. goto start
复制代码
说明:
检查e:\abc.dat文件,大于等于15K,则移动此文件到G:\abc文件夹,并依时间重新命名,防止命名冲突。文件小于15K不做处理,15秒检查一次。
注意事项:g:\abc文件夹必须存在,否则会有报错。
风险:
使用中到文件是否可以移动,未测试。
其他风险,未知。
建议:根据文件大小增长速度适当调节检测时间间隔,修改第8行 timeout 15
作者: 福垊    时间: 2021-4-6 06:30

回复 16# newgain


    经测试,效果不错,按时间排序,谢谢。
作者: 福垊    时间: 2021-4-6 06:39

回复 13# qixiaobin0715


    刚才测试了一下,效果很好,只是到了该重命名009时,提示存在一个重命名文件,新产生的abc.bat,无法改名为abc009.bat 。
作者: 福垊    时间: 2021-4-6 06:40

回复 15# newgain


    非常感谢,应该会有办法的。
作者: 福垊    时间: 2021-4-6 06:54

回复 16# newgain


set ntime=%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
【请问这是设定什么时间和日期,数值的意思是什么?】
for /f "delims=" %%i in ("e:\abc.dat") do (
【请问,这里的分隔符,切割文本的作用是什么?】
if %%~zi geq 15360 (
如果文件大于等于15K,可这里的360是什么意思呢?360天吗?
还请高手大佬指教,谢谢。
作者: qixiaobin0715    时间: 2021-4-6 08:49

15×1024=15360
作者: 福垊    时间: 2021-4-6 09:49

回复 20# qixiaobin0715
原来如此
作者: hlzj88    时间: 2021-4-6 20:51

已经结贴,水一个,按第五种模式
  1. @echo off&&setlocal enabledelayedexpansion
  2. set p=0
  3. set /a p+=1
  4. :xh
  5. if exist abc.dat (
  6.    if exist abc!p!.dat (set /a p+=1&&goto xh) else (
  7.      ren abc.dat abc!p!.dat
  8.      echo 发现abc.dat并改名 %time%
  9.      ping /n 180 127.1>nul
  10.      goto xh)) else (
  11. echo 等待产生abc.dat %time%
  12. ping /n 180 127.1>nul
  13. goto xh)
复制代码
说明   1 无论是否有abc.dat,都按每3分钟循环检测是否存在。3分钟检测想必文件也大不了多少。   2 有abc.dat,自动判断并按序改名,不是删除。
作者: 福垊    时间: 2021-4-7 16:17

回复 22# hlzj88 非常感谢。
作者: 福垊    时间: 2021-4-9 16:23

本帖最后由 福垊 于 2021-4-9 17:39 编辑

终于搞定了




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