Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
如何在windows中的特定时间点后查找新文件?(命令行)_Windows_Batch File - Fatal编程技术网

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

如何在windows中的特定时间点后查找新文件?(命令行),windows,batch-file,Windows,Batch File,我知道linux中有一种方法可以过滤特定时间后生成的所有文件。 但我们如何在windows命令行中做到这一点呢?或者在bash中。 例如,我在一个文件夹中有三个文件。2016年10月10日12:12:54之后,新文件生成到此文件夹,我需要知道新文件的名称、大小和路径。 或 我不知道什么时候会生成新文件。我想每10分钟检查一次。如果有一些新文件生成后,一个特定的,我可以得到文件的名称,路径和大小。 我搜索了一些关于这方面的信息,我知道我可以使用forfiles/P directory/S/D+08

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

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

与依赖文件时间戳相反,这肯定会识别每一个新文件。检查时间戳时,由于上次运行错误,文件可能被视为新文件,或者新文件可能无法被错误识别,尤其是在脚本执行期间创建的此类文件

下面是代码:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“TARGET=D:\Data”&rem/(要观察的目录的路径)
设置“PATTERN=*.*”&rem//(搜索匹配文件的模式)
设置“LIST=%TEMP%\%~n0”&rem//(列表文件的基本文件名)
设置“FIRSTALL=#”&rem/*(定义首次运行时的行为:
rem设置为任意值以返回所有文件;
rem设置为空以不返回任何文件)*/
rem/*确定存在哪个列表文件,确保只有一个,
rem然后在文件扩展名`.one`/`.two`之间切换:*/
设置“LISTOLD=%LIST%.two”
设置“LISTNEW=%LIST%.one”
如果存在“%LIST%.one”(
如果不存在“%LIST%.two”(
设置“LISTOLD=%LIST%.one”
设置“LISTNEW=%LIST%.two”
)否则(
删除“%LIST%.one”
如果首先定义(
>%LIST%.two“rem/
)否则(
删除“%LIST%.two”
)
)
)否则(
如果不存在“%LIST%.two”(
如果首先定义(
>%LIST%.two“rem/
)
)
)
rem/*创建新列表文件,包含匹配文件的列表
rem按创建日期升序排序:*/
>%LISTNEW%”目录/B/A:-D/O:D/T:C“%TARGET%\%PATTERN%”
如果不存在“%LISTOLD%”(
>nul 2>&1复制/Y“%LISTNEW%”“%LISTOLD%”
)
rem//搜索新列表文件以查找旧列表文件中不存在的项目:
2> nul findstr/V/I/X/L/G:“%LISTOLD%”“%LISTNEW%”
如果错误级别2类型为“%LISTNEW%”
rem//删除旧列表文件:
删除“%LISTOLD%”
端部
退出/B
首次运行脚本时,将返回受监视目录中的所有文件,除非将
set“FIRSTALL=#”
更改为
set“FIRSTALL=“
,在这种情况下,第一次不会返回任何文件

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


假设脚本自上次运行.bat以来被保存为
新文件,您可以围绕另一个小脚本展开,该脚本构成一个无休止的循环,轮询率为10分钟,如下所示:

@echo关闭
:循环
>nul超时/T 600/NOBREAK
调用“%~dp0自上次运行以来的新文件.bat”
转到:循环

不过,设置Windows任务计划程序可能是一个更好的选择。

键入
forfiles/?
不要使用
/s
。请参见
timeout/?
goto/?
。键入
Help
。作为超时的替代方法,您可以使用任务计划程序,每十分钟运行一次批处理文件(我猜是这样的)。
forfiles
只检查上次修改日期,而不检查创建日期;此外,它根本不关心时间,因此您不能使用它来检查是否有自最后10分钟以来创建的新文件(如果我没有弄错您的意图)。另一种完全不同的方法如何:将文件列表(请参见
dir/?
)存储到文本文件中,并每隔10分钟将其与实际可用的文件进行比较?这避免了批处理中本机不支持的日期/时间数学…@aschipfl我可以这样做,但我认为这不是一种有效的方法;仅对少数文件而言,这可能比批量计算日期/时间要容易得多(除非您借用了其他语言的代码,否则必须自己编写);对于成千上万的文件,这可能不是一个很好的解决方案。。。无论如何,临时文件方法的最大优点是,您将始终捕获自上次调用以来创建的所有文件;检查文件期限时,您可能会错过在上一次脚本执行期间创建的文件。。。