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

[文本处理] 批处理如何智能判断文件的内容是否更新并显示最后一行?

想要达到两个功能:
一、显示某文本文件最后一行的内容。
二、显示一次后,要开始判定这个文本文件的内容是否更新了,如果更新则继续显示这个文本文件的最后一行(其实也就是更新之后的内容了),如果判定文件内容没有更新,则等待文件更新。

我的思路有两个:
一、我创建两个批处理文件,其中A负责显示文本文件,B负责更新文本文件,当文本文件更新后,B就临时创建一个临提醒文件,当A监测到有提醒文件时,就显示文本文件的最后一行,然后删除提醒文件,然后等待提醒文件的再一次出现。但是这个方法,我觉得伤硬盘!
二、方法和一基本一样,只不过将创建提醒文件更改为修改系统日期,当文本文件更新后,就修改当前日期为1111年,当A文件监测到当前系统年份为1111年时,就显示文本文件最后一行,然后修改系统日期为正确的日期,然后等待系统日期的再一次改变!但是这个方法,会看到屏幕右下角的系统日期变来变去!

不知道各位大侠有没有什么好方法来达到这种目的?

本帖最后由 pcl_test 于 2015-2-25 20:50 编辑

回复 1# binghejin
假设有文本文件test.txt
  1. @echo off
  2. if not exist *.t (
  3. for /f "skip=1 tokens=3" %%t in ('dir "test.txt" ^|find ":"') do cd.>"%%t.t"
  4. )
  5. for /f "delims=" %%i in ('type "test.txt"') do set "str1=%%i"
  6. echo,尾行内容为:%str1%
  7. ping 0 -n 2 >nul 2>nul
  8. cls
  9. :begin
  10. for /f %%j in ('dir /b *.t') do set "name=%%~nj"
  11. for /f "skip=1 tokens=3" %%a in ('dir "test.txt" ^|find ":"') do set "size=%%a"
  12. if not "%name%" == "%size%" (
  13. for /f "delims=" %%j in ('type "test.txt"') do set "str2=%%j"
  14. ren "%name%.t" "%size%.t"
  15. call echo,尾行内容为:%%str2%%
  16. echo 更新于%time:~0,8%
  17. echo 按任意键后将继续监测文本更新情况……
  18. pause >nul
  19. cls
  20. ) else (
  21. echo 等待更新中……
  22. ping 0 -n 2 >nul 2>nul
  23. cls
  24. )
  25. goto begin
复制代码

TOP

感谢2楼提供代码,明天测试一下,但是利用ping来等待2秒不是不行,不过无法做到实时更新,而且利用文件比较的方法来检测文件内容的变化,这种频繁读取文件的方法还是伤硬盘啊!
其实就是b批处理文件更新文本文件后,怎样告诉a批处理的问题!

TOP

哎呦 这个挺好的想法

TOP

不管如何,必然需要无限循环来保持代码运行,批处理没有sleep,最好的方法当然是ping

TOP

回复 3# binghejin

先说明下,只要是对系统及文件的任何修改都是对硬盘的写入操作,就如楼主所以为的修改日期,实际也是会对硬盘进行写入的,而且楼主有点夸大了,这样的小数据的频繁写入加起来对硬盘的影响可能还没有移动一个1M的文件所带来的大,何况我只是利用了文件的重命名,并不对文件进行写入,这样影响就更小了;至于说有延时什么的,楼主可以自行修改,代码仅供参考

TOP

本帖最后由 caruko 于 2015-2-26 10:34 编辑
  1. @echo off
  2. set "file=要监控的文件"
  3. copy "%file%" _$
  4. :loop
  5. for %%a in ("%file%") do if %%~za gtr %size% set "size=%%~za"&call :display
  6. ping 0 -n 2 >nul 2>nul
  7. goto :loop
  8. :display
  9. for /f "tokens=1* delims=:" %%a in ('fc "!file!" _$ ^|findstr /R "[0-9]*:"') do set /a row=%%a&set "str=%%b"
  10. del _$&&copy "%file%" _$
  11. echo,新增行数至【%row%】,内容为:%str%
复制代码

TOP

call /?
有可以看到文件的修改时间的,只要变化了就读

TOP

返回列表