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

时间:2016-10-10 23:45:55

标签: windows batch-file

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

1 个答案:

答案 0 :(得分:0)

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

反对依赖文件时间戳,这肯定会识别每个新文件。检查时间戳时,自上次运行错误以来文件可能被视为新文件,或者错误地识别新文件,尤其是在执行脚本期间创建的文件。

所以这是代码:

@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任务计划程序可能是更好的选择。