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

时间:2016-04-30 05:20:08

标签: file batch-file vbscript 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     

MessageBox.vbs

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

1 个答案:

答案 0 :(得分: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

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

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

echo %%~ai打印属性(有关详细信息,请参阅for /?

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

|| goto :loop作为“如果上一个命令(find)失败,则再次从标签:loop开始”

如果find成功(归档属性),则会处理下一行(echo file was changed ...)

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