如何在将文件添加到目录时运行Windows批处理脚本或Perl脚本?

我正在尝试编写一个脚本来parsing本地文件并将其内容上传到MySQL数据库。 现在,我在想一个运行Perl脚本的批处理脚本可以工作,但不知道这是否是完成这个任务的最好方法。

另外,我想这个脚本在数据文件被添加到某个目录时立即运行。 这在Windows中可能吗?

思考? 反馈? 我对Perl和Windows批处理脚本相当新,所以任何指导,将不胜感激。

您可以使用Win32 :: ChangeNotify 。 当文件被添加到目标目录时,你的脚本将被通知。

检查新建文件的文件夹可以使用WMI功能来实现。 也就是说,您可以创建一个Perl脚本,用于订阅CIM_DirectoryContainsFile类实例的创建的__InstanceCreationEvent WMI事件。 一旦这种事件被激发,你知道一个新的文件已经被添加到文件夹,并可以根据需要进行处理。

这些文章提供了有关这个主题的更多信息,并包含VBScript代码示例(希望它不会很难将它们转换为Perl):

  • 如何随时将文件添加到文件夹中如何自动运行脚本?
  • WMI和文件系统监视

你想要的功能是ReadDirectoryChangesW 。 快速搜索perl包装器将产生此Win32 :: ReadDirectoryChanges模块。

你的脚本看起来像这样:

 use Win32::ReadDirectoryChanges; $rdc = new Win32::ReadDirectoryChanges(path => $path, subtree => 1, filter => $filter); while(1) { @results = $rdc->read_changes; while (scalar @results) { my ($action, $filename) = splice(@results, 0, 2); ... run script ... } } 

你可以使用File::ChangeNotify在Perl中轻松实现。 这个模块可以在CPAN上找到: http : //search.cpan.org/dist/File-ChangeNotify/lib/File/ChangeNotify.pm

您可以将代码作为守护程序或作为服务运行,使其监视一个或多个目录,然后在某些条件匹配时自动执行一些代码(或启动脚本)。

最重要的是,它是跨平台的,所以如果你想切换到Linux机器或Mac,它仍然会工作。

把一个使用FileSystemWatcher类的小型C#应用程序放在一起来检测被添加到文件夹中的文件,然后生成所需的脚本并不难。 它肯定比定期轮询文件夹使用更少的CPU /系统资源/硬盘带宽。

你需要考虑什么是确定“修改”的充分的启发式。

按照成本和准确性的顺序:

  1. 文件大小(只要保持大小,文件内容仍然可以更改)

  2. 文件时间戳(如果你没有运行ntpd时间不是单调的)

  3. 文件sha1sum(防弹但昂贵)

我会运行ntpd,然后遍历时间戳,然后比较校验和如果时间戳更改。 这可以在很短的时间内覆盖很多地面。

这些方法不适用于计算机安全应用程序,它们用于理智的系统上的文件管理。