Как получить имя файла, которое только что было изменено, с помощью пакетной программы Windows

Я пытаюсь решить проблему, при которой отслеживаю конкретный каталог. Моя пакетная программа отслеживает изменяемые файлы и записывает их в текстовый файл. До сих пор я написал код, в котором он может определять, когда файл изменяется, и может печатать отметку времени.

Но теперь мне также нужно записать имя только что измененного файла. Может ли кто-нибудь помочь мне с этим. Вот что я сделал до сих пор:

@Echo Off
Set _Delay=10
Set _Monitor=C:\Users\MMurshed\Desktop\New folder (3)
Set _Base=%temp%\BaselineState.dir
Set _Chck=%temp%\ChkState.dir
Set _OS=6
Ver|Findstr /I /C:"Version 5">Nul
If %Errorlevel%==0 Set _OS=5 & Set /A _Delay=_Delay*1000
:_StartMon
Call :_SetBaseline "%_Base%" "%_Monitor%"
:_MonLoop
If %_OS%==5 (Ping 1.0.0.0 -n 1 -w %_Delay%>Nul) Else Timeout %_Delay%>Nul
Call :_SetBaseline "%_Chck%" "%_Monitor%"
FC /A /L "%_Base%" "%_Chck%">Nul
If %ErrorLevel%==0 Goto _MonLoop
::
:: Insert code to run when a change occurs
::
Echo.Change Detected
Echo.Timestamp = %date:~0,2%%date:~3,2%%date:~6,8%-%time:~0,2%%time:~3,2%%time:~6,2%


Goto :_StartMon
:::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subroutine
:::::::::::::::::::::::::::::::::::::::::::::::::::
:_SetBaseline
If Exist "%temp%\tempfmstate.dir" Del "%temp%\tempfmstate.dir"
For /F "Tokens=* Delims=" %%I In ('Dir /S "%~2"') Do (
Set _Last=%%I
>>"%temp%\tempfmstate.dir" Echo.%%I
)
>"%~1" Findstr /V /C:"%_Last%" "%temp%\tempfmstate.dir"
Goto :EOF

person user3624406    schedule 09.10.2015    source источник
comment
Возможно, это не та технология, которую вы искали, но, возможно, она могла бы помочь. gallery.technet.microsoft.com/scriptcenter/   -  person lit    schedule 10.10.2015


Ответы (2)


Доступ к WMI из кода VBScript, встроенного в пакетный файл, для отслеживания изменений каталога и выполнения необходимых действий внутри этого кода (в настоящее время он выводит информацию на консоль):

@echo off
set "vbsfile=%temp%\dirwatch%random%.vbs"
>"%vbsfile%" (
    for /f "delims=: tokens=* eol=" %%a in ('findstr /b ":::" "%~dpnx0"') do echo.%%a
)
cscript //nologo "%vbsfile%"
del "%vbsfile%"
exit /b

:::intInterval = "10"
:::strDrive = "c:"
:::strFolder = replace("\Users\MMurshed\Desktop\New folder (3)", "\", "\\")
:::strComputer = "."
:::
:::Set objWMIService = GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" &_
::: strComputer & "\root\cimv2" )
:::
:::Set events = objWMIService.ExecNotificationQuery( _
::: "Select * From __InstanceOperationEvent" _
::: & " Within " & intInterval _
::: & " Where Targetinstance Isa 'CIM_DataFile'" _
::: & " And TargetInstance.Drive='" & strDrive & "'"_
::: & " And TargetInstance.Path='" & strFolder & "'")
:::
:::Do
::: Set fileEvent = events.NextEvent()
::: Set fileInfo = fileEvent.TargetInstance
:::
::: Select Case fileEvent.Path_.Class
:::     Case "__InstanceCreationEvent"
:::         WScript.Echo "Created: " & fileInfo.Name
:::     Case "__InstanceDeletionEvent"
:::         WScript.Echo "Deleted: " & fileInfo.Name
:::     Case "__InstanceModificationEvent"
:::         Set prevFile = fileEvent.PreviousInstance
:::         For Each prop In fileInfo.Properties_
:::             If prop.Value <> prevFile.Properties_(prop.Name) Then
:::                 WScript.Echo "Changed:        " & fileInfo.Name
:::                 WScript.Echo "Property:       " & prop.Name
:::                 WScript.Echo "Previous value: " & prevFile.Properties_(prop.Name)
:::                 WScript.Echo "New value:      " & prop.Value
:::                 WScript.Echo
:::             End If
:::         Next
::: End Select
:::Loop

P.S. Из-за ограничений квоты службы WMI подпапки не отслеживаются.

Код взят из Мониторинг WMI и файловой системы Статья Уроша Калаковича.

person wOxxOm    schedule 09.10.2015

вы можете использовать атрибут архива для проверки наличия новых или измененных файлов (это то, для чего он должен использоваться)

Windows устанавливает этот атрибут каждый раз при создании или изменении файла, поэтому просто запрашивайте у Windows «измененные файлы» :)

@echo off
rem create some files
echo hello>a.txt
echo hello>b.txt
echo hello>c.txt
call :check
echo marking them by settting the "Archive" attribute:
attrib -a *.txt
call :check
echo changing a file
echo world>>b.txt
call :check
attrib -a *.txt
goto :eof

:check
echo ========================
echo new or changed files:
dir /b /aa-d *.txt
echo ------------------------
echo unchanged files:
dir /b /a-a-d *.txt
echo ========================
goto :eof
person Stephan    schedule 09.10.2015
comment
да, но это не решает мою проблему. Мне нужна программа, которая будет отслеживать каталог и искать изменяемые файлы. Как только это произойдет, он запишет свою метку времени и имя файла. Каталог может содержать много файлов. Таким образом, он будет отслеживать все и записывать их время и имена всякий раз, когда они изменяются. Можете ли вы сделать что-нибудь в моем коде, чтобы я мог извлечь имя файла, к которому относится метка времени? - person user3624406; 09.10.2015
comment
замените dir /b /aa-d *.txt на for /f "delims=" %%i in ('dir /b /aa-d *.txt') do echo %%~ti %%i >>"%temp%\tempfmstate.dir". %%~ti - метка времени файла - person Stephan; 09.10.2015
comment
хорошо спасибо. И если я хочу повторить имя файла, какова команда? - person user3624406; 09.10.2015
comment
? %%i - это имя файла. Вы уже используете его в исходном коде ... Дополнительные возможности см. В for /? - person Stephan; 09.10.2015
comment
Я пробовал твою штуку, но она не работает. Можете ли вы изменить мой код, потому что я уже могу получить метку времени. Мне просто нужно знать, какой файл. - person user3624406; 09.10.2015