如何在windows中找到特定时间点之后的新文件?(命令行)



我知道linux中有一种方法可以过滤特定时间后生成的所有文件。但是我们如何在windows命令行中做到这一点呢?或者在bash中。例如,我在一个文件夹中有三个文件。在10/10/2016,12:12:54之后,这个文件夹生成了一个新文件,我需要知道新文件的名称,大小和路径。或者,我不知道什么时候会生成新的文件。我想每10分钟检查一次。如果有一些新的文件生成后,一个特定的,我可以得到文件的名称,路径和大小。我搜索一下,我知道我可以用forfiles /P directory /S /D +08/01/2013来做。但是它会在目录下显示08/01/2013之后修改的所有文件。但是我想要它显示目录中的文件夹和目录文件夹中的所有文件(而不是其子目录)

尽管您没有显示自己为解决任务所做的任何努力,但我决定提供一个脚本,该脚本返回自上次执行以来创建的文件列表。它不检查文件创建时间戳,因为纯批处理文件解决方案本身不支持日期/时间数学。相反,它生成一个文件列表,将其存储在一个临时文件中,并将其与先前保存的列表进行比较。

与依赖文件时间戳相反,这将肯定地识别每个新文件。当检查时间戳时,文件可能被认为是新的,因为上次运行错误,或者新文件可能无法被错误地识别,特别是在脚本执行期间创建的文件。

代码如下:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "TARGET=D:Data"    & rem // (path to the directory to observe)
set "PATTERN=*.*"       & rem // (search pattern for matching files)
set "LIST=%TEMP%%~n0"  & rem // (file base name of the list files)
set "FIRSTALL=#"        & rem /* (defines behaviour upon first run:
                          rem     set to anything to return all files;
                          rem     set to empty to return no files) */
rem /* Determine which list file exists, ensure there is only one,
rem    then toggle between file name extensions `.one`/`.two`: */
set "LISTOLD=%LIST%.two"
set "LISTNEW=%LIST%.one"
if exist "%LIST%.one" (
    if not exist "%LIST%.two" (
        set "LISTOLD=%LIST%.one"
        set "LISTNEW=%LIST%.two"
    ) else (
        erase "%LIST%.one"
        if defined FIRSTALL (
            > "%LIST%.two" rem/
        ) else (
            erase "%LIST%.two"
        )
    )
) else (
    if not exist "%LIST%.two" (
        if defined FIRSTALL (
            > "%LIST%.two" rem/
        )
    )
)
rem /* Create new list file, containing list of matching files
rem    sorted by creation date in ascending order: */
> "%LISTNEW%" dir /B /A:-D /O:D /T:C "%TARGET%%PATTERN%"
if not exist "%LISTOLD%" (
    > nul 2>&1 copy /Y "%LISTNEW%" "%LISTOLD%"
)
rem // Search new list file for items not present in old one:
2> nul findstr /V /I /X /L /G:"%LISTOLD%" "%LISTNEW%"
if ErrorLevel 2 type "%LISTNEW%"
rem // Delete old list file:
erase "%LISTOLD%"
endlocal
exit /B

脚本第一次运行时,将返回监控目录下的所有文件,除非将set "FIRSTALL=#"更改为set "FIRSTALL=",否则第一次不返回任何文件。

核心命令是findstr,它被配置为旧列表文件提供用于搜索新列表文件的文字搜索字符串,并返回不匹配的行,因此输出的是新列表文件中没有出现在旧列表文件中的行。


假设脚本保存为new-files-since-last-run.bat,您可以封装另一个小脚本,它构成一个无限循环,轮询率为10分钟,如下所示:

@echo off
:LOOP
> nul timeout /T 600 /NOBREAK
call "%~dp0new-files-since-last-run.bat"
goto :LOOP

设置Windows任务调度程序可能是一个更好的选择。

相关内容

  • 没有找到相关文章

最新更新