Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何使用windows批处理程序获取刚修改的文件名_Batch File_Directory_Last Modified - Fatal编程技术网

Batch file 如何使用windows批处理程序获取刚修改的文件名

Batch file 如何使用windows批处理程序获取刚修改的文件名,batch-file,directory,last-modified,Batch File,Directory,Last Modified,我正在尝试解决一个问题,我正在监视一个特定的目录。我的批处理程序监视被修改的文件,并将它们记录在txt文件中。到目前为止,我已经编写了代码,它可以检测文件何时更改,并可以打印时间戳 但现在我还需要它来记录刚刚修改的文件名。谁能帮我一下吗。以下是我迄今为止所做的工作: @Echo Off Set _Delay=10 Set _Monitor=C:\Users\MMurshed\Desktop\New folder (3) Set _Base=%temp%\BaselineState.dir Set

我正在尝试解决一个问题,我正在监视一个特定的目录。我的批处理程序监视被修改的文件,并将它们记录在txt文件中。到目前为止,我已经编写了代码,它可以检测文件何时更改,并可以打印时间戳

但现在我还需要它来记录刚刚修改的文件名。谁能帮我一下吗。以下是我迄今为止所做的工作:

@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

您可以使用归档属性检查新文件或更改的文件(这就是它应该用来检查的)

Windows在每次创建或更改文件时都会设置此属性,因此只需向Windows询问“已更改的文件”
:)


从批处理文件中嵌入的VBScript代码访问WMI,以监视目录更改,并在此代码中执行所需操作(当前它将信息打印到控制台):

@echo关闭
设置“vbsfile=%temp%\dirwatch%random%.vbs”
>%vbsfile%(
对于/f“delims=:tokens=*eol=“%%a in('findstr/b::”“%~dpnx0”)执行回显。%%a
)
cscript//nologo“%vbsfile%”
删除“%vbsfile%”
退出/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(_
:“从InstanceOperationEvent中选择*_
:&“内部”和内部_
:&“其中Targetinstance是‘CIM_数据文件’”_
:&“And TargetInstance.Drive=”&strDrive&“_
:&“And TargetInstance.Path=”&strFolder&“”)
:::
刘易斯
::Set fileEvent=events.NextEvent()
::Set fileInfo=fileEvent.TargetInstance
:::
::选择Case fileEvent.Path\u.Class
::案例“\u InstanceCreationEvent”
::WScript.Echo“已创建:”&fileInfo.Name
::案例“\uu instanceDeleteEvent”
::WScript.Echo“已删除:”&fileInfo.Name
::案例“\uu InstanceModificationEvent”
::Set prevFile=fileEvent.PreviousInstance
::对于fileInfo.Properties中的每个道具_
::如果prop.Value prevFile.Properties(prop.Name)那么
::WScript.Echo“已更改:&fileInfo.Name
::WScript.Echo“属性:&prop.Name
::WScript.Echo“上一个值:&prevFile.Properties(prop.Name))
::WScript.Echo“新值:&prop.value”
::WScript.Echo
::如果结束
下一个
::结束选择
::循环
另外,由于WMI服务的配额限制,子文件夹不受监视


代码取自乌罗斯·卡拉科维奇的文章。

是的,但它不能解决我的问题。我需要一个程序,它将监测一个目录,并寻找得到修改的文件。一旦完成,它将记录其时间戳和文件名。该目录可能包含许多文件。因此,每当他们被“修改”时,它将监控所有人并记录他们的时间和姓名。您能在我的代码中做些什么,以便提取时间戳所指的文件名吗?将
dir/b/aa-d*.txt
替换为
for/f“delims=“%%I in('dir/b/aa-d*.txt')do echo%%~ti%%I>%temp%\tempfstate.dir”
%%~ti
是文件的时间戳OK谢谢。如果我想回显一个文件名,命令是什么
%%i
是文件名。您已经在原始代码中使用了它。。。请参阅
以获取/?
以了解更多可能性我尝试了你的方法,但无效。你能修改我的代码吗?因为我已经可以得到时间戳了。我只需要知道是哪一个文件。这可能不是你想要的技术,但也许它能帮上忙。
@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
@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