标题: [文本处理] 批处理如何智能判断文件的内容是否更新并显示最后一行? [打印本页]
作者: binghejin 时间: 2015-2-25 17:08 标题: 批处理如何智能判断文件的内容是否更新并显示最后一行?
想要达到两个功能:
一、显示某文本文件最后一行的内容。
二、显示一次后,要开始判定这个文本文件的内容是否更新了,如果更新则继续显示这个文本文件的最后一行(其实也就是更新之后的内容了),如果判定文件内容没有更新,则等待文件更新。
我的思路有两个:
一、我创建两个批处理文件,其中A负责显示文本文件,B负责更新文本文件,当文本文件更新后,B就临时创建一个临提醒文件,当A监测到有提醒文件时,就显示文本文件的最后一行,然后删除提醒文件,然后等待提醒文件的再一次出现。但是这个方法,我觉得伤硬盘!
二、方法和一基本一样,只不过将创建提醒文件更改为修改系统日期,当文本文件更新后,就修改当前日期为1111年,当A文件监测到当前系统年份为1111年时,就显示文本文件最后一行,然后修改系统日期为正确的日期,然后等待系统日期的再一次改变!但是这个方法,会看到屏幕右下角的系统日期变来变去!
不知道各位大侠有没有什么好方法来达到这种目的?
作者: pcl_test 时间: 2015-2-25 19:37
本帖最后由 pcl_test 于 2015-2-25 20:50 编辑
回复 1# binghejin
假设有文本文件test.txt- @echo off
- if not exist *.t (
- for /f "skip=1 tokens=3" %%t in ('dir "test.txt" ^|find ":"') do cd.>"%%t.t"
- )
- for /f "delims=" %%i in ('type "test.txt"') do set "str1=%%i"
- echo,尾行内容为:%str1%
- ping 0 -n 2 >nul 2>nul
- cls
- :begin
- for /f %%j in ('dir /b *.t') do set "name=%%~nj"
- for /f "skip=1 tokens=3" %%a in ('dir "test.txt" ^|find ":"') do set "size=%%a"
- if not "%name%" == "%size%" (
- for /f "delims=" %%j in ('type "test.txt"') do set "str2=%%j"
- ren "%name%.t" "%size%.t"
- call echo,尾行内容为:%%str2%%
- echo 更新于%time:~0,8%
- echo 按任意键后将继续监测文本更新情况……
- pause >nul
- cls
- ) else (
- echo 等待更新中……
- ping 0 -n 2 >nul 2>nul
- cls
- )
- goto begin
复制代码
作者: binghejin 时间: 2015-2-25 23:39
感谢2楼提供代码,明天测试一下,但是利用ping来等待2秒不是不行,不过无法做到实时更新,而且利用文件比较的方法来检测文件内容的变化,这种频繁读取文件的方法还是伤硬盘啊!
其实就是b批处理文件更新文本文件后,怎样告诉a批处理的问题!
作者: ads350668398 时间: 2015-2-25 23:50
哎呦 这个挺好的想法
作者: caruko 时间: 2015-2-26 10:02
不管如何,必然需要无限循环来保持代码运行,批处理没有sleep,最好的方法当然是ping
作者: pcl_test 时间: 2015-2-26 10:15
回复 3# binghejin
先说明下,只要是对系统及文件的任何修改都是对硬盘的写入操作,就如楼主所以为的修改日期,实际也是会对硬盘进行写入的,而且楼主有点夸大了,这样的小数据的频繁写入加起来对硬盘的影响可能还没有移动一个1M的文件所带来的大,何况我只是利用了文件的重命名,并不对文件进行写入,这样影响就更小了;至于说有延时什么的,楼主可以自行修改,代码仅供参考
作者: caruko 时间: 2015-2-26 10:26
本帖最后由 caruko 于 2015-2-26 10:34 编辑
- @echo off
- set "file=要监控的文件"
- copy "%file%" _$
- :loop
- for %%a in ("%file%") do if %%~za gtr %size% set "size=%%~za"&call :display
- ping 0 -n 2 >nul 2>nul
- goto :loop
- :display
- for /f "tokens=1* delims=:" %%a in ('fc "!file!" _$ ^|findstr /R "[0-9]*:"') do set /a row=%%a&set "str=%%b"
- del _$&© "%file%" _$
- echo,新增行数至【%row%】,内容为:%str%
复制代码
作者: mms0536 时间: 2015-2-27 23:57
call /?
有可以看到文件的修改时间的,只要变化了就读
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |