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

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

本帖最后由 pcl_test 于 2017-4-10 14:00 编辑

我的  D:\log\  下面每天都会生成  *.log  日志文件,我现在想获取当天的文件的最后一行,并将其单独放在一个叫 temp.txt  的文件里,谢谢。

*.log的格式是怎么样的
***共同提高***

TOP

*.log的格式和*.txt几乎一样

TOP

回复 3楼 的帖子

晕,我是问你*.log是不是如同2010-11-22.log
***共同提高***

TOP

不好意思哈!之前误解您的意思了。
log文件名例如:11292010.Log

TOP

忽略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 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

楼上的朋友,我刚刚测试了你给的代码,运行之后,DOS界面一闪而过,然后根本没有运行成功。
请再帮忙看看!谢谢!

TOP

修改过了。。。。。。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

刚才我测试你的代码了,虽然能生成temp.txt,但是里面的内容却不是最新的log文件的最后一行,请看截图。

TOP

我的电脑是WIN2000,刚才我在WINXP上做了测试,你的代码是OK的。

TOP

回复 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)

TOP

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

评分人数

    • zidian5: 乐于助人,技术过关技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 12楼 的帖子

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

非常感谢!你修改后的代码运行OK (在WinXP上面)

TOP

你的错误在于使用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 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 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

TOP

返回列表