我需要创建一个批处理脚本,持续监视特定文件的更改,在本例中为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"
答案 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
取消设置文件的存档属性。