监视文件更改的批处理脚本

Jam*_*Mry 1 vbscript file batch-file monitor

我需要创建一个批处理脚本,持续监视特定文件的更改,在本例中为LogTest.txt.

文件更新后,它将触发一个VBScript消息框,显示LogTest.txt中的最后一行.这个想法是,在消息框被清除后,这将继续监控.

我尝试过使用该forfiles选项,但这只能让我处理日期而不是时间.我知道PowerShell和其他选项都可用,但由于原因太长而无法解释,我只能使用批处理和VBScript.

批处理文件:

@echo off

:RENEW

forfiles /m LogTest.txt /d 0
if %errorlevel% == 0 (
  echo The file was modified today
  forfiles /M LogTest.txt /C "cmd /c echo @file @fdate @ftime"
  cscript MessageBox.vbs "Error found."
  REM do whatever else you need to do
) else (
  echo The file has not been modified today
  dir /T:W LogTest.txt
  REM do whatever else you need to do
)

goto :RENEW     
Run Code Online (Sandbox Code Playgroud)

MessageBox.vbs:

Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox "This is an error", vbOkCancel + vbExclamation, "Error Found"
Run Code Online (Sandbox Code Playgroud)

Ste*_*han 5

每个文件都有一个归档属性.Windows在对文件的每次写访问时设置此属性.

您可以使用该attrib命令进行设置,并检查它,例如:

@echo off
:loop  
timeout -t 1 >nul  
for %%i in (LogTest.txt) do echo %%~ai|find "a">nul || goto :loop
echo file was changed
rem do workload
attrib -a LogTest.txt
goto :loop
Run Code Online (Sandbox Code Playgroud)

timeout /t 1 >nul:减少CPU负载的小等待间隔(从不构建没有空闲时间的循环)

for %%i in (logTest.txt) do...处理文件

echo %%~ai打印属性(详见for /?)

|find "a" >nul尝试在前一个输出中找到"a"rchive属性echo,并将任何输出重定向到nirvana(我们不需要它,只需要错误级别)

|| goto :loop作为"如果上一个命令(find)失败,然后再次在标签处:loop"

如果find成功(有存档属性),那么接下来的行会被处理(echo file was changed...)

attrib -a LogTest.txt 取消设置文件的存档属性.