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

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

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

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

回复 16楼 的帖子

在您的代码基础上我又进行了一点修改,现在达到了我的目的了:
   发现D:\scan\下面有非空的文件夹,就开始执行扫描病毒,扫描发现没有病毒就拷贝走并删除源文件,若扫描发现病毒则报警。


@echo off  
:a:循环监视D:\scan目录
echo 请勿动,正在监控之中......
ping 127.1 -n 5 >nul
cls
pushd D:\scan
for /f "delims=" %%b in ('dir /a /b') do (
for /f %%j in ('dir /a/b "%%b"') do (if exist "%%b" goto :b))
goto :a

:b:延迟5秒
echo 5秒之后扫毒开始......
ping 127.1 -n 5 >nul
start "" "iexplore.exe"
cls

:c:循环监视Scan进程
echo 正在扫描病毒......
ping 127.0.0.1 -n 5 >nul  
tasklist|find /i "iexplore.exe"||goto:d
cls
goto:c

:d:检查病毒扫描日志
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
echo %a%|find /i "Risks: 0"&&goto:e||goto:f

:e :上传数据无病毒
cls
xcopy D:\scan E:\scaned /s /e /y
echo 上传的数据没有病毒,已经转移到达目的地!
ping 127.1 -n 5 >nul
cls
echo 3秒钟之后清除源文件
@ping 127.0.0.1 -n 3 >nul
for /f "delims=" %%c in ('dir /ad /b D:\scan') do (
dir /a-d /b /s "D:\scan\%%c" && rd /s/q "D:\scan\%%c") >nul
cls
goto:a

:f :上传数据有病毒
cls
start "" "D:\log\alarm.bat"
echo 上传的数据可能存在病毒,请检查......
pause
goto:a

TOP

回复 16楼 的帖子

首先谢谢您一直这么热心的帮助我!

对于您的代码和我的需求还有一点点差异:
用户在客户端使用数据上传系统会要求他先输入工号(例如:A00123),这时服务器端 D:\scan\  里马上生成名为“A00123”的空文件夹,然后用户传的文件就会在 A00123 文件夹里 (备注:这样方便用户在服务器上快速找到自己上传的文件)。

现在批处理在服务器端运行时出现的问题是:用户的个人文件夹 A00123 刚刚创建好,还没有开始往里面上传东西,此时批处理已经开始“30秒之后扫毒开始......”,此时D:\scan\  下面只有一个空文件夹 A00123 ,用户还没有传资料,根本还没有一个字节,所以此时批处理应该仍然处于“请勿动,正在监控之中......”才正确。
如果 A00123 里面开始有文件传上来了,才应该开始“30秒之后扫毒开始......”(即:给用户30秒钟时间上传),因为有时用户创建了他工号命名的文件夹之后,因为某种原因然后就走了,没有接着执行上传文件,那对于一个空的文件夹就不应该扫毒了。

TOP

1,不要在for的子句里循环goto!
2,尽量不要在for的子句中放太多代码,设计、测试、修改都很麻烦!
3,如果可以,尽量把每一部分功能都标签段落,这样方便自己也方便别人。
  1. @echo off
  2. :a:循环监视D:\scan目录
  3. for /f "delims=" %%a in ('dir /a/b/s D:\scan') do set a=%%a
  4. if not defined a (
  5.         echo 请勿动,正在监控之中......
  6.         ping 127.1 -n 5 >nul
  7.         cls
  8.         goto:a
  9. )
  10. :b:延迟30秒
  11. echo 30秒之后扫毒开始......
  12. ping 127.1 -n 30 >nul
  13. start "" "scan.exe"
  14. cls
  15. :c:循环监视Scan进程
  16. echo 正在扫描病毒......
  17. ping 127.0.0.1 -n 5 >nul  
  18. tasklist|find /i "scan.exe"||goto:d
  19. cls
  20. goto:c
  21. :d:检查病毒扫描日志
  22. echo 病毒扫描完成......
  23. cls
  24. echo 正在检查病毒扫描日志......
  25. for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set da=%%a&set db=0%%b&set dc=0%%c
  26. for /f "delims=" %%a in (D:\log\%db:~-2%%dc:~-2%%da%.log) do set a=%%a
  27. echo %a%|find /i "Risks: 0"&&xcopy D:\scan E:\scaned /cqfiserhk||start "" "Alarm.bat"
  28. echo 上传的数据没有病毒,已经转移到达目的地!
  29. cls
  30. goto:a
复制代码
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 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

你的错误在于使用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

回复 12楼 的帖子

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

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

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

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

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

TOP

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

TOP

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

TOP

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

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

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

TOP

返回列表