我正在尝试执行以下操作:
我有一个我想读的文件,如果在最后一行找到某个短语,我想执行一个动作。
这是文本文件的最后几行
PC要么一遍又一遍地重复上述日志文件,要么就不会有任何关闭。
我基本上想要阅读最后一行并查看它是否找到“无法获得注册状态”以及是否运行脚本。
这是我到目前为止所拥有的,但我认为我无法接近我应该做的事情。任何帮助都会非常感激,因为我不擅长编写脚本。我基本上试图计算行数并将其存储在变量中:
@echo off
for /f %%i in ('find /v /c "" ^< C:\Client.log') do set /a lines=%%i
set /a startLine=%lines%
for /f "tokens=*" %%a in ('findstr /i "Failed to get registration state. Error" more /e +%startLine% C:\Client.log') do echo %%a
答案 0 :(得分:1)
@echo off
for /f "tokens=*" %%a in (C:\Client.log) do set "line=%%a"
echo "%line%"|findstr /i /c:"Failed to get registration state. Error" >nul
if errorlevel 1 (
echo not found
) else (
echo found
)
line
将依次设置为每行的内容。当for
循环结束时,它将包含最后一行的内容。然后测试字符串,但由于它包含空格,您需要/c:
否则它会在带引号的字符串中找到任何的单词。
[编辑:添加@echo off
行,并在管道回显中%line%
周围插入引号。]
由于您的目标行似乎包含重定向器,因此需要引号。
我从你的评论中得出结论,你的最后一行可能是
<![LOG[RegTask: Failed to get registration state. Error: 0x8009000b]LOG]!>
令人遗憾的是,您还没有发布示例,没有编辑您的问题以添加您的代码,因此您正在使用的代码的精确布局(这是至关重要的)仍然是一个谜。
答案 1 :(得分:0)
@echo off
setlocal
rem Get the number of last line
for /f %%i in ('find /v /c "" ^< C:\Client.log') do set "lastLine=%%i"
rem Get the number of last line where target string was found
for /f "delims=[]" %%a in ('find /N /i "Failed to get registration state. Error" C:\Client.log') do set "lastFound=%%a"
if "%lastFound%" equ "%lastLine%" echo Run the script