繁体   English   中英

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

[英]How can I get a Windows batch or Perl script to run when a file is added to a directory?

我正在尝试编写一个脚本来解析本地文件并将其内容上传到MySQL数据库。 现在,我认为运行Perl脚本的批处理脚本可以工作,但我不确定这是否是实现此目的的最佳方法。

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

思考? 反馈? 我是Perl和Windows批处理脚本的新手,所以任何指导都会受到赞赏。

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

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

可以使用WMI功能实现检查新创建文件的文件夹。 也就是说,您可以创建一个Perl脚本,该脚本订阅__InstanceCreationEvent WMI事件,该事件跟踪CIM_DirectoryContainsFile类实例的创建。 一旦触发了这种事件,您就知道文件夹中添加了一个新文件,可以根据需要对其进行处理。

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

你想要的功能是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,它仍然可以工作。

你需要考虑什么是足够的启发式来确定“修改”。

按成本和准确度递增顺序:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM