找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 77156|回复: 17

[文本处理] 批处理怎样获取/提取当天的文件的最后一行?

[复制链接]
发表于 2010-11-26 17:26:33 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2017-4-10 14:00 编辑

我的  D:\log\  下面每天都会生成  *.log  日志文件,我现在想获取当天的文件的最后一行,并将其单独放在一个叫 temp.txt  的文件里,谢谢。
发表于 2010-11-26 17:32:17 | 显示全部楼层
*.log的格式是怎么样的
 楼主| 发表于 2010-11-26 19:48:52 | 显示全部楼层
*.log的格式和*.txt几乎一样
发表于 2010-11-26 20:59:08 | 显示全部楼层

回复 3楼 的帖子

晕,我是问你*.log是不是如同2010-11-22.log
 楼主| 发表于 2010-11-30 13:52:48 | 显示全部楼层
不好意思哈!之前误解您的意思了。
log文件名例如:11292010.Log
发表于 2010-11-30 20:33:30 | 显示全部楼层
忽略log文件中存在敏感字符的可能:
  1. @echo off
  2. for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
  3. for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
  4. >>D:\log\temp.txt echo %a%
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-1 08:55 编辑 ]
 楼主| 发表于 2010-12-1 08:42:56 | 显示全部楼层
楼上的朋友,我刚刚测试了你给的代码,运行之后,DOS界面一闪而过,然后根本没有运行成功。
请再帮忙看看!谢谢!
发表于 2010-12-1 08:55:55 | 显示全部楼层
修改过了。。。。。。
 楼主| 发表于 2010-12-1 09:10:55 | 显示全部楼层
刚才我测试你的代码了,虽然能生成temp.txt,但是里面的内容却不是最新的log文件的最后一行,请看截图。
 楼主| 发表于 2010-12-1 09:27:24 | 显示全部楼层
我的电脑是WIN2000,刚才我在WINXP上做了测试,你的代码是OK的。
 楼主| 发表于 2010-12-1 10:03:45 | 显示全部楼层

回复 8楼 的帖子

现在我对代码进行了功能扩充,执行过程是:
1. 提取当天的log文件最后一行到temp.txt文件里
2. 然后将temp.txt文件里的所有空格取消掉
3. 然后再判断temp.txt文件里时候含有“Risks:0”这串字符,如果有这字符串则将 D:\Scan\AA.txt 拷贝到 E:\Scaned\里面

我这些代码是不是太冗余太杂乱了,您是否可以帮我简化简化?
还有就是如果第3个步骤里再增加一步“不含有‘Risks:0’这串字符,则运行行‘alarm.bat’这个文件”怎么写呢?for.....do...应该不行吧?
谢谢!

@echo off
for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
>D:\log\temp.txt echo %a%


setlocal enabledelayedexpansion
for /f "delims=" %%a in (temp.txt) do (
set a=%%a
set a=!a: =!
echo !a! >>temp.log )
del /q temp.txt & ren temp.log temp.txt


for /f "tokens=1,*" %%w in ('findstr "Risks:0" temp.txt') do (
xcopy D:\Log\test.bat D:\test\ /s /e /y)
发表于 2010-12-1 10:17:50 | 显示全部楼层
1,在“提取当天的log文件最后一行到temp.txt文件里”时就直接删除空格
  1. @echo off
  2. for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
  3. for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
  4. set a=%a: =%
  5. >>D:\log\temp.txt echo %a%
  6. findstr /i "Risks:0" D:\log\temp.txt>nul&&copy "D:\Scan\AA.txt" "E:\Scaned"||start "" "alarm.bat"
复制代码
2,不删除空格,在findstr中使用/c
  1. @echo off
  2. for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
  3. for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
  4. >>D:\log\temp.txt echo %a%
  5. findstr /i /c:"Risks: 0" D:\log\temp.txt>nul&&copy "D:\Scan\AA.txt" "E:\Scaned"||start "" "alarm.bat"
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-1 11:49 编辑 ]

评分

参与人数 1技术 +1 收起 理由
zidian5 + 1 乐于助人,技术过关

查看全部评分

 楼主| 发表于 2010-12-1 11:23:44 | 显示全部楼层

回复 12楼 的帖子

因为log文件里的内容实际是例如:“...................Scan Complete:  Risks: 0   Scanned: 3074.................”,里面有空格,我试过判断“Risks: 0 ”的话,会出错,就算有病毒(例如:Risks: 5)也会继续执行文件拷贝动作,如果取消掉空格,然后判断“Risks:0 ”,则不会出问题。

非常感谢!你修改后的代码运行OK (在WinXP上面)
发表于 2010-12-1 11:47:14 | 显示全部楼层
你的错误在于使用findstr查询“Risks: 0”上。
用空格分隔多个搜索字符串,除非参数以 /c 为前缀。要在文件中搜索“Risks:”或“0”,请键入:
findstr /i "Risks: 0" temp.txt
要在文件中搜索“Risks: 0”,即空格不作为分隔符使用,请键入:
findstr /i /c:"Risks: 0" temp.txt

如果不是复杂匹配查询,完全可以使用find命令。上面的代码就可以写成:
  1. @echo off
  2. for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
  3. for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
  4. echo %a%|find /i "Risks: 0">nul&&copy "D:\Scan\AA.txt" "E:\Scaned"||start "" "alarm.bat"
复制代码
这样就不需要temp.txt这个临时文件了。
如果%date%的返回日期为“2010-12-01 星期三”,则可以精简为:
  1. @echo off
  2. for /f "delims=" %%a in (D:\log\%date:~5,2%%date:~8,2%%date:~0,4%.log) do set a=%%a
  3. echo %a%|find /i "Risks: 0">nul&&copy "D:\Scan\AA.txt" "E:\Scaned"||start "" "alarm.bat"
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-1 12:01 编辑 ]
 楼主| 发表于 2010-12-1 17:11:32 | 显示全部楼层

回复 14楼 的帖子

我将您修改后的代码,放进我的代码里,却运行不了(备注:我原来的那部分代码单独运行OK,你这部分代码单独运行OK)
我希望结合你的代码实现:
  1. 这个批处理会一直在监控D:\scan\文件夹,如果发现这个文件夹下面开始有文件了,则等待30秒之后就调用“Scan.exe”来扫描D:\scan\这个文件夹
  2. 反复检查电脑当前是否有Scan.exe这个进程,如果扫描病毒结束,则这个Scan.exe进程就消失了,然后开始检查扫描病毒日志
  3,接下来就是你给我的代码了即:查看当天的log文件的最后一行里是否有“Risks:0”,若有则将D:\scan\下面的内容全部拷贝到E:\scaned\下面去,若无“Risks:0”则可能有病毒,就执行"Alarm.bat"给我发送邮件

请帮忙看看这两部分代码放在一起之后什么冲突造成了运行失败(我现在对批处理的学习还比较零碎,敬请指教,谢谢!)


@echo off
:xunhuan

pushd D:\scan
for /f "delims=" %%b in ('dir /a /b') do (
for /f %%j in ('dir /a/b "%%b"') do (if exist "%%b" echo  30秒之后扫毒开始......
ping 127.0.0.1 -n 30 >nul
start scan.exe
cls
:Scan
echo 正在扫描病毒......
ping 127.0.0.1 -n 5 >nul  
tasklist|findstr "scan.exe" || goto :OK
cls
goto :Scan
:OK
echo 病毒扫描完成......
cls
echo 正在检查病毒扫描日志......


for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
set a=%a: =%
>D:\log\temp.txt echo %a%
findstr /i "Risks:0" D:\log\temp.txt>nul&&xcopy D:\scan\*.* E:\scaned\ /s /e /y || start "" "Alarm.bat"
echo 上传的数据没有病毒,已经转移到达目的地!


cls
goto :xunhuan
)
)
echo 请勿动,正在监控之中......
@ping 127.0.0.1 -n 5 >nul
cls
goto :xunhuan
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 11:22 , Processed in 0.023500 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表