当 .log 文件包含文本时执行批处理文件

当 .log 文件包含文本时执行批处理文件

我搜索了好久,反复尝试。我以为这会是一个简单的任务,但我运气不佳……

我有一个 .log 文件(称为 output.log),它会自动由程序更新。每次该文件中出现某个文本(称为“test”)时,我都希望运行某个程序或批处理文件。我还希望它保持打开状态,并在每次出现该文本时运行该程序。

我正在使用 Windows 10。

我尝试过这个:

powershell -command "select-string -path c:\output.log -pattern "text" | "c:\Windows\System32\calc.exe"

但无论文件中是否有“文本”匹配,它都会运行计算......

答案1

@echo off 

setlocal EnableDelayedExpansion
cd/d "%~dp0" & set "_cnt=0"

:loop
for /f %%i in ('type output.log^|find/c /i "text"
')do if "%%~i" == "!_cnt!" (goto :loop) else set "_cnt=%%~i"

start "" /b "%__AppDir__%calc.exe" & cls 
%__AppDir__%timeout.exe 3 | echo\Waiting for file change ...

goto :loop

但我希望保持其持续监控,并在每次向 .log 文件中添加“文本”时执行该程序。*

您可以计算字符串出现的次数,并监视文件...当您增加计数器时,程序将被执行,否则,它会等待...


有没有办法让循环“超时”?假设它在一分钟内收到输入。我只希望它对第一个输入采取行动,忽略其余输入,但在第一分钟之后继续监控。

我不确定我是否理解了,我的英语很差,抱歉!而且,最接近我所达到的可能建议:

@echo off

cd/d "%~dp0" && setlocal
%__AppDir__%mode.com 82,3
set "_MMSS=OS Get localdatetime"
set "_wmic=%__AppDir__%wbem\wmic.exe"

for /f useback %%i in (`type output.log^|find/c /i "text"`
   )do set "_cnt=%%~i" && set "_start=%time: =0%"

:loop
for /f useback^delims^=. %%i in (`%_wmic% %_MMSS%^|%__AppDir__%findstr.exe \.`
   )do set "_ms=%%~i" && set "_time=%_start:~0,8%/%time: =0%" & title <nul 

set "_time=%_time:~0,17%" && if "%_60s%" == "" set /a "_60s=1%_ms:~-4%-9940"

set "_msg=..\%~0 ^| %_time:/= / % ^| %_ms:~-4% ^>^= %_60s% ^| "
title %_ms:~-4% ^| Occurrences: %_cnt% & echo;%_msg% %_cnt% && set "_ms=%_ms:~-4%"

for /f useback %%i in (`type output.log^|find/c /i "text"`)do set "_cnt=%%i" && (
   if %%~i gtr %_cnt% if %_ms% leq %_60s% start "" /b "%__AppDir__%calc.exe")
  
%__AppDir__%timeout.exe 5|echo...\Waiting for file change... & goto :loop

相关内容