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

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

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

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

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

TOP

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

TOP

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

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

回复 12楼 的帖子

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

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

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

回复 16楼 的帖子

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

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

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

TOP

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

返回列表